を使用してboost::ptr_vector
いますが、これは標準にも当てはまると思いますstd::vector
。オブジェクトへのポインターをポリモフィックにboost::ptr_vector
階層に配置しようとしていますが、次の行で作成されたEntity
ことを継承するということですObject
Object * newObject = new Entity(param1, param2); // then I attempt to add it to the ptr_vector
しかし、プログラム (Visual Studio 2010) を中断して何が保持されているかを確認すると、ポインターがガベージからリダイレクトされることはなく、ガベージが保持されています。コードをステップ実行すると、パラメーター化されたコンストラクターに入り、正しい論理ステップに従います。
何がうまくいかないのかわからない。このポリモーフィックな動作を機能させるには、親または子に特定のメンバー関数が必要ですか (現在、すべての子には、その型に固有のパラメーター化されたコンストラクターと、ポリモーフィックな相互作用メソッドと共にデストラクタがあります)。代入演算子が必要か、Object
クラスにコンストラクターが必要か。
operator への呼び出しがnew
オブジェクトに解決されていないようですが、別のものに解決されているようですが、VS2010 はエラーをスローしていません。
編集:何が起こっているべきかの説明。
2D std::vector
(長方形/非ギザギザ) のステップスルー
case/switch
生成され、構造に追加されるオブジェクトを決定するために使用
Object へのポインタが作成され、new に割り当てられます // ここで問題が発生していると思います
次に、そのポインターの参照がマネージャーメンバーにプッシュされますboost::ptr_vector
Visual Studio 2010 では、ポインターを作成する行に区切りを入れ、新しい (ポリモーフィック) を割り当て、ポインターpush_back()
をboost::ptr_vector
監視する行に 1 つ割り当てます。一時ポインター値が作成され、コンストラクターにステップインすると、そのコンストラクターのすべての論理ステップに従います。コンストラクターが終了し、スタックがコンストラクターを呼び出した行に戻ると、ポインターは同じ値のままです (これは許容されます)、しかし、それがすべての値を指しているオブジェクトを見ると、(静的に構成されたメンバー オブジェクトを含む) 疑問符として表示されます。次に、プッシュバックがトリガーされ、ブーストヘッダーに入ると、x
値に同じ情報が表示されます。
ポインターが作成され、オブジェクトのデータが作成されているように見えますが、コンストラクターが終了すると、実際には親クラス オブジェクトに値が割り当てられません。
問題のあるヘッダーの例 (実際のヘッダーにはメンバー変数があり、それらの実装は別の cpp ファイルにあります):
class Object{
public :
virtual void interact(int action, Object& source){}
virtual void updateObject(float duration){}
virtual ~Object(){}
bool operator==(const Object& _other)const;
bool operator!=(const Object& _other)const;
};
class Entity : public Object{
public:
Entity(Vector3 location, Type thisType, SpecialType difficulty=noSpecial);
~Entity();
void interact(int action, Object& source);
void updateObject(float duration);
};
編集:コンテキストを変更して、目前の問題をより適切にターゲットにし、解決策を受け取ります