如何使用“ get”方法返回类的私有std :: unique_ptr成员

时间:2019-09-04 15:59:09

标签: c++ unique-ptr

我创建了一个具有私有std :: unique_ptr成员的类,即m_VBOm_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”方法的正确方法。

如何完成?

3 个答案:

答案 0 :(得分:4)

顾名思义,唯一指针是唯一的。所以你不能克隆它!您只能移动它。

因此,基本上根据您的需求,有几种合理的解决方案:

  1. 公开对对象的引用(或对对象的原始指针):
VBO& VAO::GetVBO() const
{
    return *m_VBO;
}
  1. 所有权转移:
std::unique_ptr<VBO> VAO::takeVBO()
{
    return std::move(m_VBO);
}
  1. VBO提供克隆功能:
std::unique_ptr<VBO> VAO::clone() const
{
    return std::make_unique<VBO>(*m_VBO);
}
  1. std::unique_ptr更改为std::shared_ptr


我建议观看:Herb Sutter “Leak-Freedom in C++... By Default.”

答案 1 :(得分:1)

如果要与他人共享指针,则需要考虑谁负责所指对象的生命周期。

如果只有一个实体负责整个生命周期,那么std::unique_ptr是一个不错的选择。然后,您可以通过移动 unique_ptr来将终身管理职责转移给其他人。或者,如果您知道您的客户只是观察者并且不会参与生命周期管理,那么您可以给出原始指针(然后您需要确保持有unique_ptr的实体的生命超过所有观察者)。

如果多个实体都应该能够单独使一个对象保持活动状态(共享所有权),那么std::shared_ptr是一个更好的选择。

答案 2 :(得分:-2)

您的get函数应该看起来像

std::unique_ptr<VBO>& VBO::GetVBO()
{
    return m_VBO;
}