Unterscheidung zwischen Lese- und Schreibvorgängen bei Verwendung von operator []

8

Ich müsste eine Klasse mit einem überladenen Operator [] schreiben, der ein anderes Verhalten hat, wenn der Operator [] zum Lesen oder Schreiben von Daten verwendet wird. Um ein praktisches Beispiel zu geben, was ich erreichen möchte, muss ich sagen, dass ich die Implementierung einer Klasse namens PhoneBook schreiben muss, die auf folgende Weise verwendet werden kann:

%Vor%

Das Problem liegt in der Tatsache, dass bei Verwendung von

%Vor%

Ich möchte keinen Eintrag im Telefonbuch für Frank hinzufügen, sonst wäre eine auf std :: map basierende Lösung einfach zu implementieren.

Ich habe im Internet keinen Standard gefunden, um dies zu erreichen Nach einigem Nachdenken kam ich zu der folgenden Lösung, bei der der Operator [] ein "temporäres Objekt" namens PhoneNumber zurückgibt. PhoneNumber wird dann verwendet, um zwischen Lese- / Schreiboperationen zu unterscheiden:

%Vor%

Die Klasse PhoneBook verhält sich wie ich möchte und das Programm druckt:

%Vor%

Ich möchte Ihnen einige Fragen stellen:

  1. Gibt es einen besseren Weg, um eine Klasse zu erhalten, die sich wie die von mir codierte Klasse verhält?
  2. Hat die Technik ich verwende einen Namen, so dass ich mehr Informationen darüber suchen kann?
  3. Sehen Sie irgendwelche Nachteile / mögliche Verbesserungen in meiner Lösung?

In der Bibliothek schreibe ich und aktiviere das Verhalten, das ich für PhoneBook :: operator [] erhalten habe in einer ähnlichen Situation ist wirklich wichtig und ich würde gerne wissen, was Sie über mein Problem denken.

Danke!

    
carlo 17.02.2012, 15:19
quelle

2 Antworten

8

Was Sie vorschlagen, ist die Standardlösung für dieses Problem. Es ist normalerweise bekannt als Proxy-Muster oder Proxy-Idiom und die Hilfsklasse, die Sie Rückkehr wird als Proxy bezeichnet. (Da es sich um eine geschachtelte Klasse handelt, rufen Sie einfach auf it Proxy ist im Allgemeinen ausreichend.)

    
James Kanze 17.02.2012, 15:26
quelle
-1

Ich denke, Sie können zwei Versionen von operator [] implementieren, einen mit const-Modifikator und den anderen ohne. Wenn Sie dann ein Objekt sagen PhoneBook phoneBook(999999); , das If phoneBook ist const Objekt, kann nur operator [] const aufgerufen werden. Wenn phoneBook ein nicht-konstantes Objekt ist, wird standardmäßig operator [] aufgerufen. Wenn Sie operator [] const für ein nicht-konstantes Objekt aufrufen möchten, können Sie eine Umwandlung wie static_cast<const PhoneBook&>(phoneBook)->operator[...] hinzufügen.

%Vor%     
Yun Huang 17.02.2012 15:54
quelle

Tags und Links