Update: Das shared_ptr in diesem Beispiel ähnelt dem in Boost, unterstützt jedoch nicht shared_polymorphic_downcast (oder dynamic_pointer_cast oder static_pointer_cast)!
Ich versuche, einen gemeinsam genutzten Zeiger auf eine abgeleitete Klasse zu initialisieren, ohne den Referenzzähler zu verlieren:
struct Base { };
struct Derived : public Base { };
shared_ptr<Base> base(new Base());
shared_ptr<Derived> derived;
// error: invalid conversion from 'Base* const' to 'Derived*'
derived = base;
So weit, ist es gut. Ich hatte nicht erwartet, dass C ++ Base * implizit in Derived * konvertiert. Ich möchte jedoch, dass die Funktionalität durch den Code ausgedrückt wird (dh die Referenzanzahl wird beibehalten, während der Basiszeiger heruntergespielt wird). Mein erster Gedanke war, einen Cast-Operator in Base bereitzustellen, damit eine implizite Konvertierung in Derived stattfinden kann (für Pedanten: Ich würde überprüfen, ob der Down-Cast gültig ist, keine Sorge):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
Nun, es hat nicht geholfen. Es scheint, dass der Compiler meinen Typecast-Operator völlig ignoriert hat. Irgendwelche Ideen, wie ich die shared_ptr-Zuweisung zum Laufen bringen könnte? Für zusätzliche Punkte: Was für ein Typ Base* const
ist das? const Base*
Ich verstehe, aber Base* const
? Worauf bezieht const
sich in diesem Fall?