2016-05-05 40 views
1

Ich machte eine Klasse Array, die ein Integer-Array enthält. Von der Hauptfunktion versuche ich, ein Array-Array in Array mit [] zu verwenden, wie wir es für Arrays tun, die in main deklariert sind. Ich habe den Operator [] wie im folgenden Code überladen; Die erste Funktion gibt einen L-Wert und den zweiten Teil einen rvalue (Konstruktoren und andere Mitgliedsfunktionen sind nicht gezeigt.)C++ Operatorüberladung [] für lvalue und rvalue

#include <iostream> 
using namespace std; 

class Array { 
public: 
    int& operator[] (const int index) 
    { 
     return a[index]; 
    } 
    int operator[] (const int index) const 
    { 
     return a[index]; 
    } 

private: 
    int* a; 
} 

jedoch bei dem Versuch, diese beiden Funktionen von Haupt zu nennen, werden nur die erste Funktion ist, selbst zugegriffen wird, wenn Die Variable wird nicht als L-Wert verwendet. Ich kann nicht den Punkt sehen, eine separate Funktion für einen rvalue zu erstellen, wenn alles durch die lvalue-Funktion erledigt werden kann.

Der folgende Code ist die Hauptfunktion I verwendet (Operator < < in geeigneter Weise überlastet ist.):

#include "array.h" 
#include <iostream> 
using namespace std; 

int main() { 
    Array array; 
    array[3] = 5;    // lvalue function called 
    cout << array[3] << endl; // lvalue function called 
    array[4] = array[3]   // lvalue function called for both 
} 

Gibt es eine Möglichkeit, die R-Wert-Funktion aufrufen kann? Ist es auch notwendig, Funktionen für Lvalue und Rvalue zu definieren?

+0

Die Operatoren sollten wahrscheinlich als 'int &' und 'const int &' und nicht als 'Array' deklariert werden. –

+0

Ja, du hast Recht. Mein Fehler – HelperKing

Antwort

6

Die zweite Funktion ist ein const member function und es wird aufgerufen, wenn Sie eine const Instanz haben:

const Array array; 
cout << array[3] << endl; // rvalue function called 

Es ist nicht üblich, diese „L-Wert“ zu nennen und „R-Wert“ -Funktionen. Und Sie könnten die Konstante const definieren, um eine const-Referenz zurückzugeben, wenn Sie möchten.

+0

Die const-Funktion würde aufgerufen, aber das Ergebnis konnte in diesem Beispiel nicht zugewiesen werden. – doug