2010-11-29 7 views
0

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!

Répondre

0

Je suis sacrément confus au sujet de wtf que vous essayez de faire puisque vous passez des entiers à make_shared. Votre problème peut être résolu en acceptant une référence à Entity::EntityPtr en get_pointer.

+0

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

+0

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. –

Questions connexes