cannot convert 'this' pointer from 'const Foo' to 'Foo &'
lima-city → Forum → Programmiersprachen → C/C++ und D
anmerkung
antwort
bar code
bit
code
dank
doppelte datenmenge
fehler
folgendes code
folgendes schreiben
gedanke
obige fehlermeldung
objekt
operator
referenz
sagen
sinn
theoretische aspekt
unbedingt guter stil
zuweisung
-
// Die obige Fehlermeldung erscheint beim Kompilieren. Rätselfrage: Wo ist der Fehler?
class Foo
{
private:
int m_FooCnt;
public :
Foo(){
m_FooCnt = 0;
}
Foo(const Foo & rhs)
{
m_FooCnt = rhs.GetFooCnt();
}
int GetFooCnt() { return m_FooCnt; } ;
int& operator=(const Foo &)
{
return m_FooCnt;
}
};
class Bar : public Foo
{
int BarCnt;
};
Beitrag zuletzt geändert: 14.4.2011 13:18:16 von matem -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo matern,
wenn Du uns sagen würdest, in welcher Zeile der Fehler ist, dann wäre es einfacher.
Aber ich vermute mal, dass es daran liegt, dass GetFooCnt() nicht als const deklariert ist.
Probiere mal folgendes:
int GetFooCnt() const { return m_FooCnt; }
Edit:
Dein Zuweisungsoperator sieht auch komisch aus. Was willst Du damit erreichen?
Sollte das nicht sowas sein:
Foo& operator=(const Foo & foo) { m_FooCnt = foo.m_FooCnt; return *this; } Foo& operator=(int foo_cnt) { m_FooCnt = foo_cnt; return *this; }
Beitrag zuletzt geändert: 14.4.2011 14:18:22 von darkpandemic -
Danke darkpandemic.
Du hast Recht, dass GetFooCnt const sein muss.
Hier noch die Operatoren:
const Foo& operator=(const Foo & rhs) { m_FooCnt = rhs.GetFooCnt(); return *this; } const Foo& operator=(const int & rhs){ m_FooCnt = rhs; return *this; } operator const int() { return this->GetFooCnt(); }
Damit klappt dann auch:
Foo f = 13; const int n = f;
-
Hallo matem,
freut mich, dass das funktioniert hat.
Allerdings habe ich noch ein paar Anmerkungen:
Den Zuweisungsoperator für int würde ich so schreiben:
Bei Integralen Datentypen mach eine Übergabe per Referenz nur Sinn, wenn man den Wert der Ursprungsvariable ändern will. In diesem Fall soll das aber nicht passieren, weshalb das nur zu unnötigem Overhead führt:Foo& operator=(int i) { m_FooCnt = i; return *this; }
- Anlegen der Variable auf dem Stack
- Übergabe des Zeigers (der bei 64-Bit Programmen 8 Byte groß ist, d.h. in diesem Fall doppelte Datenmenge)
Und es würde mich noch interessieren, weshalb Du const Foo& anstelle von Foo& zurückgibst?
Beitrag zuletzt geändert: 15.4.2011 20:12:01 von darkpandemic -
Hallo darkpandemic,
es geht bei der Rückgabe von const Foo& im Zuweisungsoperator prinzipiell darum, Folgendes zu vermeiden:
(f=13)=15;
Wie kann man z.B. Folgendes ausschließen?
Foo v = (f=13);
-
Hallo matem,
ich wollte ja nur wissen, welcher Gedanke hinter der Entscheidung steht.
Bei mir wären die Beispiele durchaus legitim.
Man kann ja auch
schreiben.int a = 3; int b = a = 2;
Ein theoretische Aspekt wäre noch, dass das Objekt nicht const sein kann, wenn man ihm einen Wert zuweisen kann. Von daher ist es halt evtl. merkwürdig, wenn eine Zuweisung ein Objekt in ein const Objekt verwandelt.
Es wäre ja möglich, dass irgendjemand Folgendes schreiben will:
void foobar(Foo& foo, int bar) { (foo=bar)++ }
Das ist nicht unbedingt guter Stil, aber es gibt Leute die so etwas exzessiv anwenden.
Danke für die Antwort.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage