繁体   English   中英

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

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

本示例代码所示,我使用了此方法来创建基类/派生类。

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

您需要在std::unique_ptr上调用get 来“解包”存储在其中的原始指针

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

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

请记住, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM