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が終了することもあります。
私はここで間違っていることを誰かが助けてくれることを願っています。ありがとう!
My EntityおよびTextEntityクラスのコンストラクタは両方とも整数の引数をとります。だから私はそれをmake_sharedに渡している。私は参照を追加し、それは働いた!どのように私の方法に欠陥があるのかを説明するためのケア?私はいつもshared_ptrへの参照がno-noであるという前提の下にいました。 – eric
最初に、間違った仮定。あなたがどこにいるのかわからない。次に、あなたのバージョンは値でポインタを渡していました。その値を 'e ='で設定すると、うまくいっていますが、呼び出し元のエンティティは決してそれについて聞きません。すべてのものと同様に、関数内のパラメーターに加えられた変更がパラメーターとして使用される変数に影響を与えるようにするには、参照する必要があります。ポインタと共有ポインタについても同様です。 –