C++ boost::shared_ptr 作为类的成员并重复设置其值
C++ boost::shared_ptr as a member of a class and repeatedly setting its value
我正在尝试找出使用boost::shared_ptr作为类成员实现的最干净方法。假设我有 A 类,其中包含对 B 类成员的提升::shared_ptr。B 类可以是基类型 (B) 或派生类型(假设 C 或 D)。此成员将在类 A 的整个生命周期内连续获取/设置(使用访问器/修饰符)。B 必须是多态的,所以我不能只将其存储为 B,而是存储为 B 的引用/指针。我也想避免自己管理内存。假设这一切看起来像:
class A
{
public:
const B& GetB() const { const B* b = m_pB.get(); return *b; } // Is the correct way to do this?
void SetB(const B& b) { B* b = m_pB.get(); *b = b; } // Is the correct way to do this?
private:
boost::shared_ptr<B> m_pB;
};
我知道我可能做错了什么,但我想举一个例子来说明我正在努力实现的目标。谢谢!
我认为这个程序的设计需要重新思考。
共享指针的目的是将动态分配的资源保留在其中,以便它管理该资源的生命周期。 如果你正在更改那里的内容,那么你有责任在替换那里的指针后管理该资源的生命周期,这将导致混乱。
您可能应该使用新的共享指针分配m_pB变量,以便原始指针超出范围并释放最初持有的资源。 因此,分配在共享指针上,而不是在它持有的指针上。
在资源库中,您将新数据分配给现有元素,而不是更新指针。
正确的方法是:
void SetB(shared_ptr<B> ptr)
{
m_pB = ptr;
}
因此,这样做会将对象的所有者身份转移到类中。对于使用,您可以编写如下代码:
A a;
shared_ptr<B> ptrB(new C()); //or new D, whatever
a.SetB(ptrB);
另一种选择是,如果创建 B 的代码根本不使用 shared_ptr 并且shared_ptr将封装在您的类中,则更改 setter 以获取指向 B 的指针,如下所示:
void SetB(B *pB)
{
m_pB.reset(pB);
}
最后,如果最后一个样本是您需要的,并且shared_ptr将仅限于 A 类,我会使用 scoped_ptr 而不是 shared_ptr。
相关文章:
- 嵌套在类中时无法设置成员数据
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 聚合初始化,将成员指针设置为同一结构成员
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 将 AlphaMode 成员设置为 DXGI_SWAP_CHAIN_DESC1 会使 CreateSwapChainFo
- 如何为类中可能无法计算的成员设置值
- 在运行时为随机分布类成员设置最小和最大边界?
- 是否可以为模板类的模板函数成员设置别名?
- 将常量引用成员设置为临时变量是否安全
- 对象超出范围后,引用成员设置为 0
- 为 QWidget 的私有成员设置样式表
- 将CPP类成员设置为SQLite DB中的列
- 将数组的成员设置为零
- 0-原子的初始化是否保证将值成员设置为0
- 将公共成员设置为只读
- 在模板化结构的所有实例中将成员设置为相同的值
- 如何将类成员设置为常量
- 将从std::string派生的类派生的类的数据成员设置为值
- 将继承的成员设置为静态
- 在析构函数中将类成员设置为空