Frage

Wie kann man ein Shared_Ptr konvertieren, das auf ein CONT-Objekt in ein Shared_Ptr zeigt, das auf ein nicht konstantes Objekt hinweist. Ich versuche Folgendes zu tun:

boost::shared_ptr<const A> Ckk(new A(4));

boost::shared_ptr<A> kk=const_cast< boost::shared_ptr<A> > Ckk;

Aber es funktioniert nicht.

War es hilfreich?

Lösung

'Boost :: const_pointer_cast' wird das tun, was Sie verlangen, aber die obligatorische zweite Hälfte der Antwort ist, dass Sie es wahrscheinlich nicht verwenden sollten. In 99% der Fälle, in denen es so aussieht, als müssten Sie die Const -Eigenschaft einer Variablen wegwerfen, bedeutet dies, dass Sie einen Designfehler haben. Const ist manchmal mehr als nur Fenster, die sich wegkleiden und es wegweist, kann zu unerwarteten Insekten führen.

Ohne mehr Details Ihrer Situation zu wissen, kann man nicht mit Sicherheit sagen. Aber keine Diskussion über const-cast ist vollständig, ohne diese Tatsache zu erwähnen.

Andere Tipps

verwenden boost::const_pointer_cast, Dokumentation.

Der richtige Weg sollte dies sein

boost::shared_ptr<A> kk (boost::const_pointer_cast<A>(Ckk));

std::const_cast_pointer macht einen zweiten verwalteten Zeiger. Nach der Besetzung hast du einen beschreibbaren Zeiger und Der ursprüngliche const-zeigende. Der Punkte bleibt gleich. Die Referenzzahl wurde um 1 erhöht.

Beachten Sie, dass const_cast ist ein integriertes Schlüsselwort, aber const_pointer_cast ist eine Vorlagenfunktion im Namespace std.

Der beschreibbare Zeiger kann dann verwendet werden, um den Wert unter dem zu ändern shared_ptr<const T>. IMHO Der beschreibbare Zeiger sollte nur vorübergehend auf dem Stapel bestehen; Andernfalls muss es einen Designfehler geben.

Ich habe einmal ein kleines Testprogramm geschrieben, um mir das klar zu machen, das ich für diesen Thread angepasst habe:

#include <memory>
#include <iostream>
#include <cassert>

using namespace std;

typedef shared_ptr<int> int_ptr;
typedef shared_ptr<const int> const_int_ptr;

int main(void)
{
    const_int_ptr Ckk(new int(1));

    assert(Ckk.use_count() == 1);
    cout << "Ckk = " << *Ckk << endl;

    int_ptr kk = const_pointer_cast<int>(Ckk); // obtain a 2nd reference
    *kk = 2;                   // change value under the const pointer

    assert(Ckk.use_count() == 2);
    cout << "Ckk = " << *Ckk << endl;      // prints 3
}

Unter Unix oder Windows/Cygwin kompilieren Sie mit

g++ -std=c++0x -lm const_pointer_cast.cpp
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top