2010-11-29 11 views
0

私はポインタの世界ではかなり新しく、自分のコードで問題に遭遇しました。私はshared_ptrを吐き出すファクトリクラスを持っています。 "Entity"は、このメソッドから作成される任意のタイプのshared_ptrの基本クラスです。boost_firstファクトリ関数

ポインタをget_entityメソッドで上書きすると、すべてが機能しているようです。私がget_pointerメソッドでポインタを上書きする場合、ポインタは上書きされません。

// 
// 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); 

    // ... 
} 

"e"をget_pointerメソッドに渡す理由は、私がいつもポインタを変更する必要がないためです。場合によっては、ポインタをまったく変更せずにget_pointerが終了することもあります。

私はここで間違っていることを誰かが助けてくれることを願っています。ありがとう!

答えて

0

私はあなたがmake_sharedに整数を渡すので、あなたがしようとしていることについてかなり混乱しています。

Entity::EntityPtrへの参照をget_pointerに受け入れることで問題が解決する場合があります。

+0

My EntityおよびTextEntityクラスのコンストラクタは両方とも整数の引数をとります。だから私はそれをmake_sharedに渡している。私は参照を追加し、それは働いた!どのように私の方法に欠陥があるのか​​を説明するためのケア?私はいつもshared_ptrへの参照がno-noであるという前提の下にいました。 – eric

+0

最初に、間違った仮定。あなたがどこにいるのかわからない。次に、あなたのバージョンは値でポインタを渡していました。その値を 'e ='で設定すると、うまくいっていますが、呼び出し元のエンティティは決してそれについて聞きません。すべてのものと同様に、関数内のパラメーターに加えられた変更がパラメーターとして使用される変数に影響を与えるようにするには、参照する必要があります。ポインタと共有ポインタについても同様です。 –

関連する問題