2

我试图找出最干净的方法来实现使用 boost::shared_ptr 作为类的成员。假设我有一个 A 类,其中包含一个 B 类成员的 boost::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;
};

我知道我可能做错了什么,但我想提供一个我正在努力完成的例子。谢谢!

4

2 回答 2

1

我认为这个程序的设计需要重新思考。

共享指针的目的是您将动态分配的资源留在其中,以便它管理该资源的生命周期。如果您要更改其中的内容,则在替换其中的指针后,您有责任管理该资源的生命周期,这将导致混乱。

您可能应该只使用新的共享指针分配 m_pB 变量,以便原始指针超出范围并释放最初持有的资源。因此,分配共享指针,而不是它持有的指针。

于 2012-08-10T14:48:33.130 回答
0

在您的设置器中,您将新数据分配给现有元素,而不是更新指针。

正确的方法是:

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 将被封装在您的类中,则更改设置器以获取指向 B 的指针,例如:

void SetB(B *pB)
{
     m_pB.reset(pB);
}

最后,如果最后一个示例是您需要的,并且 shared_ptr 将仅限于 A 类,我建议使用 scoped_ptr 而不是 shared_ptr。

于 2012-08-10T14:52:29.920 回答