我有一个向量,它包含来自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中的方法来创建我的基类/派生类。
有关如何使用我的对象初始化此变量的任何建议?
答案 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
。