2016-05-03 11 views
0

Das folgende ist mein Code In Zeile 74 gibt es einen Fehler: lvalue erforderlich als linker Operand der Zuweisung. Ich glaube, es liegt an der Erklärung meines Betreibers [], aber ich kann es nicht beheben. Irgendwelche Vorschläge? Danke im Voraus.Ich habe versucht, eine Vektorklasse zu erstellen. Betreffend Operatoren

#include<iostream> 

using namespace std; 

void constructArr(int *arr, int n){ 
for (int i=0; i<n; i++){ 
    arr = '\0'; 
} 
} 

class vector_int{ 
public: 
int *arr; 
int size; 
    vector_int(int n){ 
    size = n-1; 
    arr = new int [n]; 
    constructArr(arr, size); 
    } 
    vector_int(){ 
    arr = new int[1]; 
    size = 0; 
    } 
    ~vector_int(){ 
    delete [] arr; 
    } 
    void push_back(int n){ 
    int *temp; 
    temp = new int [size+1]; 
    constructArr(temp, size); 
    temp = arr; 
    temp[size] = n; 
    arr = temp; 
    size++; 
    } 
    void pop_back(){ 
    int *temp; 
    temp = new int[size-1]; 
    constructArr(temp, size-1); 
    for (int i=0; i<size-1; i++){ 
    temp[i] = arr[i]; 
} 
arr = new int [size-1]; 
arr = temp; 
size--; 
} 
int length(){ 
return size; 
} 
int top(){ 
return arr[size-1]; 
} 
int operator [](int index){ 
if (index<=size){ 
    return arr[index]; 
} 
else if (index<0 || index>size-1){ 
    return arr[size-1]; 
} 
} 
int& operator[](int index)const{  //how to correct this? 
if (index>size-1 || index<0){ 
    return arr[size-1]; 
} 
else{ 
    return arr[index]; 
} 
} 
}; 

int main(){ 
vector_int test(10); 
for (int i=0; i<10; i++){ 
test[i] = i; //compiler returns error here 
} 
    for (int i=0; i<10; i++){ 
    cout<<test[i]; 
} 
} 
+0

Art des Off-Topic: Diese Antwort könnte hilfreich sein: http://stackoverflow.com/questions/7758580/writing-your-own-stl-container/7759622#7759622 – user4581301

Antwort

0
vector_int test(10); 

Dies ist eine nicht-const Instanz der Klasse.

test[i] = i; 

Dies ist die nicht-const operator[] Überlastung Aufruf, die int zurückgibt. Hinweis, dies ist nicht int&, also versuchen Sie, einem temporären Objekt, das das Problem verursacht, einen Wert zuzuweisen (d. H. Ein temporäres ist ein rvalue und kein lvalue).

Eine andere Kuriosität ist, dass Ihre const Überladung für operator[]int& zurückgibt, was bedeutet, dass der interne Zustand geändert werden kann, was widersprüchlich ist, die Elementfunktion const zu deklarieren.

sollten Sie verwenden:

int& operator[](int) { ... } 
const int& operator[](int) const { ... } 

Oder vielleicht:

int& operator[](int) { ... } 
int operator[](int) const { ... } 
0

Ihr Fehler ist nicht auf der Linie 61, ist es auf der Linie 53, sollte es sein:

int &operator [](int index){ 

Sie Der Fehler ist aufgetreten, weil Sie diesen Wert als Referenz übergeben müssen. Dies ist sinnvoll, da Sie das Objekt immer ändern werden, wenn Sie den Operator überlasten.

+0

Ich hatte 2 Operatoren [] und ich dachte, dass es beides erkennen würde, aber es tat es nicht. – jasongog

+0

Es tat, aber das war eine illegale Operation, weshalb es nicht kompilieren würde :) – nikaza

+0

Dies ist der folgende Weg: Wenn Sie den Operator anwenden, was möchten Sie zurückgeben: der arithmetische Wert von arr [some_index] oder ein Verweis auf dieses Element? – nikaza

0

int& operator[](int index) const macht keinen Sinn. Das Schlüsselwort const bedeutet, dass der Benutzer das Objekt nicht ändert. Durch die Rückgabe einer nicht konstanten Referenz kann der Aufrufer jedoch indirekt das Objekt ändern.

Wenn Sie einen Operator für den schreibgeschützten Zugriff auf Vektorelemente deklarieren möchten, müssen Sie entweder eine Konstante const zurückgeben: const int& operator[](int index) const oder eine Kopie int operator[](int index) const. Dann garantieren Ihnen, dass operator[] auf einem const Objekt verwendet, wird es nicht ändern.

Wenn Sie einen Operator für den Zugriff auf Vektorelemente im Lese- und Schreibzugriff deklarieren möchten, müssen Sie const Schlüsselwort: int& operator[](int index) const entfernen.

Üblicherweise sollten Ihre Klasse deklarieren sowohl eine schreibgeschützte (const Methode, Rückkehr Kopie oder const-Referenz) und Schreib-/Lese (nicht const Verfahren, nicht konstante Referenz Rückkehr) operator[].

Verwandte Themen