C++ boost::shared_ptr 作为类的成员并重复设置其值

C++ boost::shared_ptr as a member of a class and repeatedly setting its value

本文关键字:成员 设置 shared boost ptr C++      更新时间:2023-10-16

我正在尝试找出使用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。