Mise à jour : le shared_ptr dans cet exemple est comme celui de Boost, mais il ne supporte pas shared_polymorphic_downcast (ou dynamic_pointer_cast ou static_pointer_cast d'ailleurs) !
J'essaie d'initialiser un pointeur partagé vers une classe dérivée sans perdre le compte des références :
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;
Jusqu'à présent, tout va bien. Je ne m'attendais pas à ce que C++ convertisse implicitement Base* en Dérivé*. Cependant, je veux la fonctionnalité exprimée par le code (c'est-à-dire maintenir le nombre de références tout en convertissant le pointeur de base). Ma première idée était de fournir un opérateur de cast dans la base pour qu'une conversion implicite en dérivé puisse avoir lieu (pour les pédants : je vérifierais que le down cast est valide, ne vous inquiétez pas) :
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
Eh bien, ça n'a pas aidé. Il semble que le compilateur ait complètement ignoré mon opérateur de typecast. Avez-vous une idée de la façon dont je pourrais faire fonctionner l'affectation de shared_ptr ? Pour les points supplémentaires : quel type de Base* const
est ? const Base*
Je comprends, mais Base* const
? Que fait const
dans ce cas ?
0 votes
Pourquoi avez-vous besoin d'un shared_ptr<Derived>, au lieu d'un shared_ptr<Base> ?
4 votes
Parce que je veux accéder à une fonctionnalité dans Derived qui n'est pas dans Base, sans cloner l'objet (je veux un seul objet, référencé par deux pointeurs partagés). Au fait, pourquoi les opérateurs de cast ne fonctionnent-ils pas ?