Frage zu Stackobjekt
-
Ein Kopierkonstruktor, wie sieht der aus?
operator=ist überladen, meinst du den?
Edit: Ach du meinstString(const String &)- ja, der existiert.Das mit der Rumcasterei kommt von hier:
String &String::operator=(const char *Data) const { this->Copy(Data); return *((String*)this); }Wenn ich das ohne den Cast mache, kommt folgender Fehler (MSVC++ 08):
error C2440: 'return': 'const String' kann nicht in 'String &' konvertiert werden
Das liegt aber daran, dass ich dort eine Referenz zurückgebe. Da ich aber dachte, es liegt am const-Attribute (welches ich im ersten Beitrag übrigens vergessen hatte), habe ich es gecastet. Aber wenn ich keine Referenz zurückgebe geht es auch ohne.Gruß
-
theliquidwave schrieb:
Wenn ich das ohne den Cast mache, kommt folgender Fehler
Und um den Fehler zu "beheben", castet man einfach, was das Zeug hält?
Das Problem ist, dass ein Zuweisungsoperator wohl die Memberfunktion ist, die am allerwenigsten von allen konstant sein kann. Schliesslich wird bei jedem Aufruf das komplette Objekt überschrieben.
-
Mhh, stimmt. Ohne das
constgeht es. Aber das brauche ich doch wiederrum, zum Beispiel in folgender Situation:void CPlayer::ServerExecute(const String &Command) { pHelpers->ClientCommand(this->m_pEdict, Command.ToCString()); // Fehler (ohne const-Modifier): error C2662: 'String::ToCString': this-Zeiger kann nicht von 'const String' in 'String &' konvertiert werden }Wenn Command keine
const-Referenz geht es, es soll aber eine sein. Ich wüsste nicht wie ich das Problem anders lösen könnte?Edit: Ahso... Ich glaube ich verstehe das Problem jetzt erst richtig. Sobald ich einer Funktion das
const-Attribute vergebe, funktioniert es. Das heißt, das ich auf alle Funktionen, die nur lesenden Zugriff auf die Membervariablen haben, denconst-Modifier setzen kann? Und immer wenn ich einenStringnur lesen brauche, verwende ich denconst-Modifier, oder nicht?Gruß
-
theliquidwave schrieb:
Mhh, stimmt. Ohne das
constgeht es. Aber das brauche ich doch wiederrum, zum Beispiel in folgender Situation:Sofern du Const-Correctness richtig einsetzt, musst du nicht casten. Sobald du
constwegcastest, liegt fast sicher ein Designfehler vor.theliquidwave schrieb:
Sobald ich einer Funktion das
const-Attribute vergebe, funktioniert es. Das heißt, das ich auf alle Funktionen, die nur lesenden Zugriff auf die Membervariablen haben, denconst-Modifier setzen kann? Und immer wenn ich einenStringnur lesen brauche, verwende ich denconst-Modifier, oder nicht?Exakt, genau so solltest du das tun.
-
Sehr schön. Habe das mal gemacht - und voila: Es funktioniert wie gewünscht, ohne irgendwelche Casts! Danke

Eine Frage habe ich dennoch... Auf Wikipedia steht zum Thema Kopierkonstruktor folgendes:
MitCopyKonstruktor mitCC2 = mitCC; // Kopierkonstruktor, ZuweisungssyntaxWird dort nun
operator=oder Kopierkonstruktor oder beides aufgerufen?!Gruß
-
theliquidwave schrieb:
Sehr schön. Habe das mal gemacht - und voila: Es funktioniert wie gewünscht, ohne irgendwelche Casts! Danke

Eine Frage habe ich dennoch... Auf Wikipedia steht zum Thema Kopierkonstruktor folgendes:
MitCopyKonstruktor mitCC2 = mitCC; // Kopierkonstruktor, ZuweisungssyntaxWird dort nun
operator=oder Kopierkonstruktor oder beides aufgerufen?!Gruß
Wies im Kommentarsteht: Es ist eine Zuweisungssyntax, aber aufgerufen wird (nur) der Copyctor.
-
Mhh.. Gibt es dann überhaupt einen Fall, in denen der
operator=gebraucht wird?Gruß
-
theliquidwave schrieb:
Mhh.. Gibt es dann überhaupt einen Fall, in denen der
operator=gebraucht wird?Gruß
Klar, wenn du den Zuweisungsoperator NACH Definition deines Objektes benutzt:
Foo f1; Foo f2; Foo f3 = f1; // CopyCtor f2 = f1; // operator=
-
Klar, wenn du 2 Objekte hast, welche bereits initialisiert sind und dann das eine dem anderen zuweist.
-
Ahso... Jetzt habe ich es erst richtig verstanden

Danke!Gruß
-
war redundant
(wurde ja schon geschrieben dass op. = nicht const sein sollte)