2011-01-01 15 views
7

Ich schreibe eine Sammelklasse. Ich möchte den eckigen Klammeroperator ([]) überladen, um Zugriff auf Elemente in der Sammlung zu gewähren.Platzhalter überladen, um den Wert zu übernehmen

int operator[](int i) 
{ 
    // Do stuff here 
} 

Mein Problem ist, dass ich sehe nicht, wie dies zu schreiben, so dass ich diesen Bediener einen Wert zu übernehmen verwenden:

myClassInstance[0] = value; 

ich keine Möglichkeit sehen, den eckigen Klammern Betreiber zu erklären ein zusätzliches Argument (der Wert, der dem Element zugewiesen werden soll).

Ich weiß, ich kann einfach int & zurückgeben, und der Aufrufer kann einen Wert zuweisen, aber intern wird jedes Element in einem anderen Format gespeichert als das, das veröffentlicht wurde.

Ist das überhaupt möglich?

+0

Sie benötigen zwei Operator [] (int) Versionen. eine const-Version und die nicht-const-Version, nach der Sie gefragt haben. Die ursprüngliche Version sollte const dahinter haben, um ein const-Objekt aufzurufen; –

+0

@ Edwin: Ich habe Ihren anderen Kommentar gesehen. Ich werde es versuchen. Vielen Dank. –

Antwort

9

Schreiben Sie eine int_proxy Klasse, die implizit in int konvertiert werden kann und von int zuweisbar ist. Sie werden mindestens zwei Mitgliedsfunktionen benötigen:

operator int(); 
int_proxy& operator=(int); 

In dieser Proxy-Klasse, zu speichern, was Informationen, die Sie benötigen, um den Wert in dem Behälter in der Lage sein abrufen und einstellen. Führen Sie den Abruf im Conversion-Operator und die Zuordnung im Zuweisungsoperator durch.

+1

Sie haben vergessen zu erwähnen, dass der ursprüngliche int-Operator [] (int) einen const-Modifikator haben sollte, der es erlaubt, auf const-Objekten aufgerufen zu werden. –

+0

Ich dachte, ich könnte das einfacher machen als das. Aber es sieht nicht so aus. Vielen Dank! –

+0

@Edwin: Gibt es eine Möglichkeit, es so zu machen, dass man ein 'const'-Objekt mit' [] 'lesen kann und ein nicht-konstantes Objekt mit demselben Operator lesen und schreiben kann? – supercat

2

Gibt einen Verweis auf ein Objekt zurück, das einen Operator = hat, der das int stopfen kann, wo es hingehört. Betrachten Sie die booleschen Vektortricks in STL für ein Beispiel, wenn auch nicht unbedingt ein wundervolles Beispiel.

1

schreiben:

int& operator[](int i) 
    { 
     // Do stuff here 
    } 
Verwandte Themen