7

我正在我的 C++ 应用程序中创建一个 GUI,我有一个名为的类GUIObject,它是所有其他组件的基类,例如Button,CheckBoxWindow

我还有一个 class GUIObjectsStorage,它由所有GUIObject创建的 s 组成。到目前为止,我一直在使用原始指针,所以我只有这个类的构造函数GUIObject

GUIObject::GUIObject() :
{
    GUIObjectsStorage::Instance().addObject(this);
}

这对我的需要来说没问题,因为每当我想访问特定对象时,我只是从GUIObjectsStorage. 但是现在我正在尝试使用智能指针,因此GUIObjectsStorage现在存储数组std::shared_ptr<GUIObject>而不是原始指针,并且我不能像以前那样使用我的构造函数:

GUIObject::GUIObject() :
{
    GUIObjectsStorage::Instance().addObject(std::shared_ptr<GUIObject>(this));
}

因为例如:

// Somewhere in code
std::shared_ptr<Button> bt = std::shared_ptr<Button>(new Button());

基本上我现在有两个shared_ptrs (一个在这里,第二个GUIObjectsStorage,因为它是在Button的构造函数中添加的),它们都有引用计数 = 1,但都指向内存中的同一个对象。然后,如果其中一个死了,对象本身也会被破坏。

所以我想出了一个想法,可能为所有继承自的类创建私有构造函数,GUIObject并创建一个静态方法,该方法将创建并返回std::shared_ptr,并将其复制添加到GUIObjectsStorage. 这样我就可以得到shared_ptrs 的引用计数 = 2,这是正确的:

class Button : public GUIObject 
{
private:
    // ...
    Button();
public:
    // ...
    static std::shared_ptr<Button>  create(); 
}

std::shared_ptr<Button> Button::create()
{
    std::shared_ptr<Button> bt = std::shared_ptr<Button>(new Button());
    GUIObjectsStorage::Instance().addObject(bt);

    return bt;
} 

通过隐藏构造函数,我可以确定没有人会以与使用create()方法不同的方式创建对象。

但这是设计这个的好方法吗?如果没有,有什么更好的解决方案来解决这个问题?

4

2 回答 2

2

这是工厂用于制造对象的经典用途。

也就是说,你可能不需要这个。你知道什么时候不再需要小部件吗?像这样的 GUI 管理器经常这样做。如果是这样,评论者是对的:指定对象的所有者,让它删除它,然后你就设置好了。

于 2013-03-24T13:20:06.977 回答
0

您可以考虑从enable_shared_from_this继承。

然后,在您拥有对象的 shared_ptr 之后,您可以使用shared_from_this()来获取包含该对象的 shared_ptr。

于 2013-03-24T09:44:58.183 回答