[英]Initializing a variable to an object from a vector holding derived classes
我有一个向量,其中包含从基类“ 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];
^
如本示例代码所示,我使用了此方法来创建基类/派生类。
关于如何使用对象初始化此变量的任何建议?
请记住, unique_ptr
实际上是什么:它是管理指针的对象,并且只允许一个实例指向给定的对象。
因此,向量的一个元素是unique_ptr
,这意味着当您执行objects[k]
您将获得一个unique_ptr
对象。 您正在尝试在此处初始化指向unique_ptr*
的SceneObject*
指针:
SceneObject* object = NULL; object = &objects[k];
但是很明显SceneObject*
!= unique_ptr*
智能指针的目标是避免使用原始指针,因此,如果在向量中使用unique_ptr
,并且对向量元素进行了销毁,则应该使用unique_ptr<SceneObject> object;
与你的循环。 然后就是:
for(...) object = objects[k];
如果希望它们在向量中保持有效,则应在两个位置都使用shared_ptr
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.