std :: shared_ptr upcasting à la classe de base - meilleure méthode?
De conversion est mieux, et quelle est la différence?
class Base
{};
class Derived : public Base, public std::enable_shared_from_this<Derived>
{};
int main(int argc, const char * argv[])
{
std::shared_ptr<Base> ptr1 = std::dynamic_pointer_cast<Base>(std::shared_ptr<Derived>(new Derived())); //version 1
std::shared_ptr<Base> ptr2 = std::shared_ptr<Derived>(new Derived()); //version 2
return 0;
}
source d'informationauteur Piotr Wach
Vous devez vous connecter pour publier un commentaire.
Comme dans d'autres cas d'utilisation de
shared_ptr
vous devriez préférer à l'aide demake_shared
au lieu de la construction de lashared_ptr
manuellement:C'est essentiellement votre version 2, plus les divers avantages de
make_shared
.Version 1 ne un tas de trucs inutiles: tout d'Abord de vous construire une temporaire
shared_ptr<Derived>
alors vousdynamic_cast
de son contenu d'une base de pointeur de classe (alors questatic_cast
serait suffisant ici) et puis vous stocker le pointeur dans une autreshared_ptr<Base>
. Si vous avez beaucoup de inutile d'exécution des opérations, mais aucun avantage sur le type de sécurité par rapport à la Version 2.Le second aurait plus de sens, car c'est l'exacte transposition de ce qui serait fait avec un vrai pointeur tout en évitant l'utilisation d'un cast explicite, c'est à dire
Une autre option serait d'utiliser
std::make_shared
précisantDerived
comme paramètre du modèle, c'est à dire:Semble la réponse la plus évidente n'a pas été mentionné donc je vais ajouter que, pour l'exhaustivité.
Vous n'avez pas besoin d'un plâtre, le meilleur moyen d'y arriver est la suivante:
découlant de
enable_shared_from_this
ne change rien dans ce cas. vous pouvez tout aussi bien utiliser les classes suivantes (faire de votre code un peu plus lisible)Bien sûr, je ne sais pas vos détails de mise en œuvre, de sorte qu'il est très possible que vous avez encore besoin de dériver de
enable_shared_from_this