[operator=] bei const class member



  • WIe geht man vor, wenn man einen Zuweisungsoperator fuer Klassen mit koanstanten Klassenattribute benoetigt.
    Hierbei wird meiner Meinung nach das "const" auch nicht gestört, da man eine Instanz mit einer anderen gleichsetzt, man also an der "alten" nicht mehr interessiert ist. V.a. wenn man die Klasse in st-constainer halten möchte ist das noetig 😞

    class Klasse
    {
    public:
       Klasse(const int& a) : const_a(a) {};
       Klasse(const Klasse& rhs) : const_a(rhs.const_a) {};
       Klasse& operator=(const Klasse& rhs)
       {
          if(this!=&rhs)
          {
             const_a = rhs.const_a; //geht ja nicht 
          }
          return *this;
       }
    
    private:
       const int const_a;
    };
    int main(){
     Klasse a(1), b(2);
     a=b;
    }
    


  • wenn sich der wert ändert, ist es nicht konstant.



  • das hieße aber, dass man solche klassen nie in einen std::vector stecken koennte



  • Hierbei wird meiner Meinung nach das "const" auch nicht gestört, da man eine Instanz mit einer anderen gleichsetzt, man also an der "alten" nicht mehr interessiert ist. V.a. wenn man die Klasse in st-constainer halten möchte ist das noetig 😞

    const bedeuted: du veränderst das Objekt nicht. Der operator= verändert es aber offensichtlich(gleichsetzen IST veränderung), also ist const "gestört".

    Warum brauchst du eigentlich const an der Stelle?



  • das ist nur interessenhalber 😉
    und ich würde dir auch rechtgeben, wenn ich

    const Klasse a(1);
    const Klasse b(2);
    a = b;
    

    verwenden würde. Bzw. sehe ich das von zwei Seiten. Klar verändere ich const member, aber eigentlich moechte ich ja zwei Klassen "gleich" setzen und somit den kompletten Inhalt übernehmen. Also sowas wie den cpy-ctor aufrufen.
    Und gerade in Hinblick auf stl-container benötigt man eben den operator=, wenn man nicht auf Pointer ausweichen möchte



  • Wenn du zwei Objekte gleichsetzt, änderst du das eine Objekt und damit auch seine Klassenmember. Damit steht fest, dass diese geändert werden können und dass eine const-Deklaration dieser Member ein fehlerhaftes Design ist. Objekte gleichzusetzen ist eben nicht das selbe wie ein Objekt zu zerstören und es durch die Kopie des anderen zu ersetzen, der Unterschied ist, dass beim Gleichsetzen zwei Objekte teilnehmen (die "Vorlage" und das, was gleichgesetzt wird), während beim Zerstören und Kopieren drei Objekte beteiligt sind (das Zerstörte, die Vorlage und die Kopie). Das ist eine Frage der Objektidentitäten und der Objektlebesdauern. Mit beidem sollte man nicht leichtfertig Schindluder betreiben 😉
    Wenn wie in deinem Fall ein Member "nur" beim op= geändert wird, ist es eben kein konstanter Member mehr. Stattdessen haben alle Memberfunktionen außer dem op= der Klasse eine Invariante, nämlich dass das entsprechende Member durch die Methoden nicht geändert wird. Lass also das const bei dem member weg und dokumentiere das entsprechend.



  • okay. wie gesagt, bisher habe ich sowas noch nicht benötigt, wollte aber wissen, ob und wie man sowas loest.
    danke!


Anmelden zum Antworten