私は、Baseクラス "SceneObject"から派生したオブジェクトを保持するベクトルを保持しています。ここに見られるように、この作業のために、私は、私はユニークなポインタを使用していたことがわかった:派生クラスを保持するベクトルからオブジェクトに変数を初期化する
vector<std::unique_ptr<SceneObject>> objects;
このベクトル内の私のオブジェクトを配置するには、私は新しいキーワードとヒープ上にメモリを割り当てる:
objects.emplace_back(new Sphere(glm::vec3(0.9, -1.925, -6.69), 0.825, sphereMaterial));
は、私のようなループ内でこれらのオブジェクトからの機能にアクセス:
objects[k]->intersect(...);
しかし、私の問題は、私は、変数「シーンオブジェクト」コンタます初期化したいということですこのベクタに格納されているオブジェクトの1つで、後でいくつかのチェックを行います...ポインタを代わりに格納しようとしていますが、これを行うときにコンパイラエラーが発生しています:
SceneObject* object = NULL;
for(...)
object = &objects[k];
エラー:
boilerplate.cpp: In function 'int main(int, char**)':
boilerplate.cpp:606:15: error: cannot convert '__gnu_cxx::__alloc_traits<std::allocator<std::unique_ptr<SceneObject> > >::value_type* {aka std::unique_ptr<SceneObject>*}' to 'SceneObject*' in assignment
object = &objects[k];
^
私のベース/派生クラスを作成するためのに見られるように、私はこの方法を使用していました。
この変数を自分のオブジェクトでどのように初期化するべきかに関する提案はありますか?
なぜ 'std :: shared_ptr'を使わないのですか? – wally