Inhalt eines Pointer in const methode ändern



  • War mir bisher so nicht bewusst

    class Someclass
    {
            double* _someP;
          
            void DoSomethingWithoutChangeMember() const
            {
                _someP = new double(5.0); // hier bekomme ich nen Compilierungsfehler was zu erwarten war
                *_someP = 5.0; // hier allerdings nicht!
            }
    }
    

    Warum darf ich den Inhalt eines Pointers in einer const Method ändern?



  • Der Standard schreibt "the cv-qualifiers affect the type of the this pointer" und danach "If the member function is declared const, the type of this is const X*". Das ist also die Begründung aus dem Standard, d.h. es wird der this pointer const, aber wenn du darin einen Pointer hast, wird das nicht propagiert.

    Man müsste also sozusagen noch const const X* haben, damit die doppelten Pointees konstant wären 🙂

    Dann ist die Frage: sollte das beliebig tief greifen?


  • Mod

    Du kannst diese Eigenart uebrigen leicht umgehen, indem Du den Zeiger (oder besser, den Verweis) in einer Klasse kapselst, die entsprechende Funktionen als const markiert. In der stdlib boete sich dafuer reference_wrapper an (alternativ kannst Du dein eigenes Template verfassen):

    class Someclass
    {
            std::reference_wrapper<double> _someP;
          
            void DoSomethingWithoutChangeMember() const
            {
                _someP = 5.0; // fehler
            }
    };
    


  • Bei einem std::shared_ptr<double> wie ich ihn in meinem Projekt habe verhält es sich gleich auch desen Inhalt lässt sich ohne Problem setzen.

    wie mach ich dass dann hier. Den shared_ptr nochmals kappseln oder davon ableiten?



  • Für was brauchst du einen shared ptr auf einen double?
    Das kommt mir komisch vor



  • Ich habe das hier der einfach halber geschrieben. Mein shared_ptr ist ein zeiger auf eine eigene Klasse die unter anderem einen std::variant<> enthält.

    diesen variant setze ich nun in meiner const Methode.

    Es ging mir ja erst mal darum warum ich einen Pointer in einer const Methode setzen kann.


Anmelden zum Antworten