如何使用 "get" 方法返回类的私有 std::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"方法的正确技术。

怎么做?

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

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

  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("C++中的泄漏自由...默认情况下。

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

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

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

你的 get 函数应该看起来像

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

最新更新