Frage zu Stackobjekt



  • Ein Kopierkonstruktor, wie sieht der aus? operator= ist überladen, meinst du den?
    Edit: Ach du meinst String(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 const geht 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, den const -Modifier setzen kann? Und immer wenn ich einen String nur lesen brauche, verwende ich den const -Modifier, oder nicht?

    Gruß



  • theliquidwave schrieb:

    Mhh, stimmt. Ohne das const geht es. Aber das brauche ich doch wiederrum, zum Beispiel in folgender Situation:

    Sofern du Const-Correctness richtig einsetzt, musst du nicht casten. Sobald du const wegcastest, 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, den const -Modifier setzen kann? Und immer wenn ich einen String nur lesen brauche, verwende ich den const -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, Zuweisungssyntax
    

    Wird 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, Zuweisungssyntax
    

    Wird 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)


Anmelden zum Antworten