2016-03-27 43 views
2

我有一个向量来存放派生于基类“SceneObject”的类的对象。对于这个任务,我发现我不得不使用独特的指针,如下所示:从一个持有派生类的向量初始化一个变量到一个对象

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

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

把我的物品这个载体里面,我在与关键字堆中分配内存

我访问这些对象的功能,在一个循环中,如:

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

但我的问题是,我想初始化变量“场景对象”,将CONTA在存储在这个向量中的一个对象稍后执行一些检查......我试图存储指针,因为我认为我应该这样做,但是在执行此操作时出现编译器错误:

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

我使用这种方法作为创建我的碱/派生类在​​看出。

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

+0

为什么不使用'std :: shared_ptr'? – wally

回答

2

你需要调用getstd::unique_ptrto "unwrap" the raw pointer内部存储:

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

注意,当你自己的API,你可以避开展开的情况下指针:std::unique_ptr提供非关联经营者,让你对待他们仿佛他们是真正的指针。

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的。

相关问题