如何使用 "get" 方法返回类的私有 std::unique_ptr 成员
How do I use a "get" method to return a private std::unique_ptr member of a class
我创建了一个包含私有 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"方法的正确技术。
怎么做?
顾名思义的唯一指针是唯一的。所以你不能克隆它!您只能移动它。
因此,基本上根据您的需求,有几个合理的解决方案:
- 公开对对象的引用(或指向对象的原始指针(:
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
我建议观看:赫伯·萨特(Herb Sutter("C++中的泄漏自由...默认情况下。
如果你与他人分享指针,你需要考虑谁负责所指向对象的生命周期。
如果只有一个实体负责生命周期,那么std::unique_ptr
是一个不错的选择。然后,您可以选择通过移动unique_ptr将终身管理责任传递给其他人。或者,如果您知道客户端只是观察者并且不会参与生命周期管理,则可以给出原始指针(然后您需要确保持有unique_ptr的实体比所有观察者都长寿(。
如果多个实体都应该能够单独保持一个对象的活动状态 - 共享所有权 - 那么std::shared_ptr
是更好的选择。
你的 get 函数应该看起来像
std::unique_ptr<VBO>& VBO::GetVBO()
{
return m_VBO;
}
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 为什么 std::unique 不调用 std::sort?
- 我对 std::unique(算法)C++有问题
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++ std::unique并没有显示我对它的期望
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 为什么 [std::unique] 不能应用于 [std::multiset]?
- 使用 std::unique 和 vector.erase 删除除最后一次出现的重复元素之外的所有元素
- 是否可以在 std::unique<T[ ]> 上应用 std::sort?
- std::unique 是否有大小限制
- 从 std::unique 返回的迭代器的用法
- 使 std::unique<T> 与 std::unique<const T, CustomDeleterType 兼容>
- Std::list.unique()应该使迭代器无效
- 无法使用初始化器列表构造 vector<std::unique<...>>
- 从自定义对象- std:unique的向量中消除重复项会导致崩溃
- 我能保证std::unique将保留第一个元素吗?
- 在 std::vector<std::unordered_set上使用 std::unique(<T>>