Je suis assez nouveau dans le monde des pointeurs et j'ai rencontré un problème dans mon code. J'ai une classe d'usine qui recrache shared_ptr. "Entité" est la classe de base pour tout type de shared_ptr créé à partir de cette méthode.boost fonction d'usine shared_ptr
Si j'écris le pointeur dans la méthode get_entity, tout semble fonctionner. Si je remplace le pointeur dans la méthode get_pointer, ce n'est pas le cas.
//
// typedef boost::shared_ptr<Entity> EntityPtr;
Entity::EntityPtr EntityFactory::get_entity(int type) {
// My default pointer if everything else falls through
Entity::EntityPtr e = boost::make_shared<Entity>(type);
std::cout << e->get_type() << std::endl; // Entity
switch (type) {
case 1:
// This works
e = boost::make_shared<TextEntity>(type);
std::cout << e->get_type() << std::endl; // TextEntity
break;
case 2:
// This doesn't work
get_pointer(e, type);
std::cout << e->get_type() << std::endl; // Entity
break;
}
return e;
}
// This function can (possibly) overwrite the passed-in pointer
void EntityFactory::get_pointer(Entity::EntityPtr e, int type) {
// ...
e = boost::make_shared<TextEntity>(type);
// ...
}
Mes raisons pour passer « e » dans la méthode get_pointer était parce que je ne dois pas toujours modifier le pointeur. Dans certains cas, get_pointer se termine sans modifier le pointeur. J'espère que quelqu'un peut aider à faire la lumière sur ce que je fais mal ici. Merci!
Le constructeur de mes classes Entity et TextEntity prend toutes deux un argument entier. C'est pourquoi je le passe à make_shared. J'ai ajouté la référence et cela a fonctionné !! Est-ce que tu t'expliquais comment mon chemin était défectueux? J'étais toujours sous l'hypothèse qu'une référence à un shared_ptr était un non-non. – eric
Première hypothèse erronée; Je ne sais pas où vous l'avez. Deuxièmement, votre version passait le pointeur par valeur. Définir cette valeur avec 'e =' est très bien, mais l'entité appelante n'en entendrait jamais parler. Comme pour toutes les choses, si vous voulez que la modification apportée au paramètre dans la fonction affecte la variable utilisée comme paramètre, vous devez prendre par référence. Cela est également vrai pour les pointeurs et les pointeurs partagés. –