从包含派生类的向量初始化变量到对象

时间:2016-03-27 22:55:34

标签: c++ pointers unique-ptr

我有一个向量,它包含来自Base类“SceneObject”的派生类的对象。对于这个任务,我发现我必须使用唯一的指针,如下所示:

vector<std::unique_ptr<SceneObject>> objects;

要将我的对象放在此向量中,我使用 new 关键字在堆上分配内存:

objects.emplace_back(new Sphere(glm::vec3(0.9, -1.925, -6.69), 0.825, sphereMaterial));

我在循环中访问这些对象的函数,如:

objects[k]->intersect(...);

但我的问题是我要初始化一个变量“SceneObject”,它将包含存储在此向量中的一个对象以便稍后执行某些检查...我正在尝试存储指针,因为我认为我应该这样做,但是在执行此操作时我遇到编译器错误:

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];
           ^

我使用this example code中的方法来创建我的基类/派生类。

有关如何使用我的对象初始化此变量的任何建议?

2 个答案:

答案 0 :(得分:2)

您需要在get to "unwrap" the raw pointer内的std::unique_ptr上致电:

SceneObject* object = NULL;
for(...)
    object = objects[k].get();

请注意,在拥有API的情况下,可以避免展开指针:std::unique_ptr提供解除引用操作符,允许您将它们视为实际指针。

答案 1 :(得分:2)

记住unique_ptr实际上是什么:它是一个管理指针的对象,只允许一个实例指向给定的对象。

因此,向量的一个元素是unique_ptr,这意味着当您执行objects[k]时,您将获得unique_ptr个对象。您正尝试在此处初始化SceneObject* unique_ptr*指针:

SceneObject* object = NULL; object = &objects[k];

但很明显SceneObject*!= unique_ptr*

智能指针的目标是避免使用原始指针,因此,如果您在向量中使用unique_ptr,并且可以使用被解析的向量元素,那么您应该使用你的循环也是unique_ptr<SceneObject> object;。然后就是:

for(...) object = objects[k];

如果您希望它们在向量中保持有效,则应在两个位置都使用shared_ptr