Wie gehe ich mit der Initialisierung eines Nicht-Konstanten-Referenzelements in einem Konstantenobjekt um?

Nehmen wir an, Sie haben eine Klasse

    class C 
    {
      int * i;

      public:

         C(int * v):i(v) {};

         void method() const;  //this method does not change i
         void method();        //this method changes i
    }

Jetzt möchten Sie möglicherweise die const-Instanz dieser Klasse definieren

    const int * k = whatever;
    const C c1(k); //this will fail

Dies schlägt jedoch aufgrund des Konstruktors C (int * v) von non-const int C fehl.

Sie definieren also einen const int -Konstruktor

    C(const int * v):i(v) {}; //this will fail also

Dies wird jedoch auch fehlschlagen, da Cs Member "int * i" nicht const ist.

Was ist in solchen Fällen zu tun? Veränderlich verwenden? Casting? Konstante Version der Klasse vorbereiten?

edit: Nach Diskussion mit Pavel (unten) habe ich dieses Problem ein wenig untersucht. Für mich ist das, was C ++ tut, nicht korrekt. Das Zeigerziel sollte ein strikter Typ sein, dh, Sie können beispielsweise Folgendes nicht ausführen:

int i;
const int * ptr;
ptr = & i;

In diesem Fall behandelt die Sprachgrammatikconst als ein Versprechen, das Ziel des Zeigers nicht zu ändern. In Ergänzungint * const ptr ist ein Versprechen, den Zeigerwert selbst nicht zu ändern. Sie haben also zwei Stellen, an denen const angewendet werden kann. Dann möchten Sie vielleicht, dass Ihre Klasse einen Zeiger modelliert (warum nicht). Und hier zerfallen die Dinge. C ++ - Grammatik bietet const-Methoden, die versprechen können, die Werte des Felds selbst nicht zu ändern, aber es gibt keine Grammatik, die darauf hinweist, dass Ihre Methode die Ziele Ihrer Zeiger in der Klasse nicht ändert.

Eine Problemumgehung besteht darin, zwei Klassen zu definierenconst_C undC zum Beispiel. Es ist jedoch keine königliche Straße. Bei Vorlagen, deren Teilspezialisierungen, ist es schwierig, nicht in Unordnung zu geraten. Auch alle möglichen Argumentationsvarianten mögenconst const_C & arg, const C & arg, const_C & arg, C & arg sieh nicht hübsch aus Ich weiß wirklich nicht, was ich tun soll. Benutze separate Klassen oder const_casts, jeder Weg scheint falsch zu sein.

In beiden Fällen sollte ich Methoden, die das Ziel des Zeigers nicht ändern, als const markieren? Oder folgen Sie einfach dem traditionellen Pfad, dass die const-Methode den Zustand des Objekts selbst nicht ändert (die const-Methode kümmert sich nicht um das Zeigerziel). Dann wären in meinem Fall alle Methoden const, weil die Klasse einen Zeiger modelliert, der Zeiger selbst also istT * const. Es ist jedoch klar, dass einige von ihnen das Ziel des Zeigers ändern und andere nicht.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage