我创建了一个具有私有std :: unique_ptr成员的类,即m_VBO
和m_EBO
,如图所示。
class VAO {
public:
VAO();
std::unique_ptr<VBO> GetVBO();
std::unique_ptr<EBO> GetEBO();
private:
std::unique_ptr<VBO> m_VBO;
std::unique_ptr<EBO> m_EBO;
};
该类还包括“ get”方法,以保护和返回那些需要时使用的成员。
这些“获取”方法的定义是
//*************************************************************************************************
std::unique_ptr<VBO> VAO::GetVBO()
{
return std::make_unique<VBO>(m_VBO);
//return std::make_unique<VBO>();
}
//*************************************************************************************************
std::unique_ptr<EBO> VAO::GetEBO()
{
//return std::make_unique<EBO>(m_EBO);
return std::make_unique<EBO>();
}
这不起作用。
我无法弄清楚编写“ get”方法的正确方法。
如何完成?
答案 0 :(得分:4)
顾名思义,唯一指针是唯一的。所以你不能克隆它!您只能移动它。
因此,基本上根据您的需求,有几种合理的解决方案:
VBO& VAO::GetVBO() const
{
return *m_VBO;
}
std::unique_ptr<VBO> VAO::takeVBO()
{
return std::move(m_VBO);
}
VBO
提供克隆功能:std::unique_ptr<VBO> VAO::clone() const
{
return std::make_unique<VBO>(*m_VBO);
}
std::unique_ptr
更改为std::shared_ptr
答案 1 :(得分:1)
如果要与他人共享指针,则需要考虑谁负责所指对象的生命周期。
如果只有一个实体负责整个生命周期,那么std::unique_ptr
是一个不错的选择。然后,您可以通过移动 unique_ptr来将终身管理职责转移给其他人。或者,如果您知道您的客户只是观察者并且不会参与生命周期管理,那么您可以给出原始指针(然后您需要确保持有unique_ptr的实体的生命超过所有观察者)。
如果多个实体都应该能够单独使一个对象保持活动状态(共享所有权),那么std::shared_ptr
是一个更好的选择。
答案 2 :(得分:-2)
您的get函数应该看起来像
std::unique_ptr<VBO>& VBO::GetVBO()
{
return m_VBO;
}