2016-04-07 4 views
1
zuweisen

Ich habe ein Problem, das der Operator [] zu verwenden, herauszufinden, einen Wert zuzuweisen, ich habe 2 verschiedene Fehler,Überlastbügel Bediener

„binary‚=‘: kein Operator gefunden, die einen rechten Operanden erfolgt vom Typ 'double' (oder es gibt keine akzeptable Konvertierung) "

Kein Operator" = "entspricht diesen Operanden.

Fehle ich hier etwas?

Kopf

Class CMyVector{ 
public: 
double operator[](const int index) const; 
double & operator[](const int index); 
CMyVector operator+(const CMyVector mv1); 
} 

cpp

double CMyVector::operator[](const int index) const 
{ 
    return arr[index]; 
} 

double & CMyVector::operator[](const int index) 
{ 
    return arr[index]; 
} 

CMyVector CMyVector::operator+(const CMyVector mv1) 
{ 
    CMyVector *retval = new CMyVector(); 

    retval[0] = arr[i] + mv1[i]; 

    return *this; 
} 

Antwort

2

CMyVector::operator+ scheint seltsam.

1. retval ist ein Zeiger (d.h. CMyVector *), dann wird retval[i]CMyVector werden, was für retval[i] = arr[i] + mv1[i]; nicht sinnvoll ist. Sie könnten meinen (*retval)[i] = arr[i] + mv1[i];. BTW: Hier ist ein Speicherverlust, weil Sie den Zeiger nicht delete haben.

2.You new ein Zeiger retval, und dann Wert darauf setzen, endlich wieder *this? Es macht keinen Sinn. Sie könnten meinen:

CMyVector CMyVector::operator+(const CMyVector& mv1) 
{ 
    CMyVector retval; 
    for (int i = 0;i < dim;i++) 
    { 
     retval[i] = arr[i] + mv1[i]; 
    } 
    return retval; 
} 
1

Im Additions-Operator-Funktion retval ist ein Zeiger, was bedeutet, Sie müssen dereferenzieren den Operator "inline" zu verwenden:

(*retval)[i] = ... 

Oder Sie könnte rufen Sie den „Pfeil“ Operator (das macht die dereferencing für Sie) die Operatorfunktion explizit mit:

retval->operator[](i) = ... 

jedoch die Variable sollte nicht ein Zeiger sein, da es die Wert ist Sie zurückkommen sollte , was bedeutet, dass Ihre Operator-Funktion fehlerhaft ist, da es Ihnen ein Speicherleck geben wird und nicht den richtigen Wert zurückgeben.

Siehe z.B. this operator overloading reference für ein Beispiel zur Implementierung.

2
CMyVector CMyVector::operator+(const CMyVector mv1) 
{ 
    CMyVector *retval = new CMyVector(); 
    for (int i = 0;i < dim;i++) 
    { 
     retval[i] = arr[i] + mv1[i]; 
    } 
    return *this; 
} 

Es gibt ein paar Probleme mit dieser Funktion:

  1. Sie sollten nicht dynamisch eine CMyVector um zuteilen nach Wert zurückzukehren; Das führt nur zu Speicherverlusten und verursacht unnötige Kosten. Es sollte nur CMyVector retval; sein.

  2. Seit retval ist ein Zeiger, retval[i] versucht, es wie ein Array zu indizieren. Sie würden wollen (*retval)[i], aber da wir die dynamische Zuordnung oben losgeworden sind, können Sie einfach retval[i] tun.

  3. Sie geben *this statt *retval zurück. Dies sollte jetzt return retval; sein.

  4. Sie sollten Ihr Argument by-Referenz nehmen, um die Kopie zu vermeiden.

  5. operator+ wird im Allgemeinen am besten als Nicht-Member-Funktion implementiert, so dass die Argumente symmetrisch behandelt werden.

Der feste Code:

CMyVector operator+(const CMyVector& lhs, const CMyVector& rhs) 
{ 
    CMyVector retval; 
    for (int i = 0; i < dim; i++) 
    { 
     retval[i] = lhs[i] + rhs[i]; 
    } 
    return retval; 
} 
+0

Arbeitete wie ein Charme, aber ich habe nur verwendet * dies wie in der Antwort unten erwähnt. –

+0

@JoachimGotzes Das hat eine ganz andere Bedeutung und wird dir nicht geben, was du willst. Beachten Sie, dass Joachim dieses Bit aus seiner Antwort gelöscht hat. Wahrscheinlich hat er angenommen, dass Sie stattdessen 'operator + =' implementieren. – TartanLlama

+0

Ja, Sie haben Recht, aber ich habe immer noch gearbeitet, wenn ich vec = vec2 * 2; Ich habe die richtigen Werte mit vec. –

Verwandte Themen