静态方法来创建对象而不是构造函数

时间:2013-03-24 09:14:00

标签: c++ oop design-patterns smart-pointers

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

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

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()); s(一个在这里,第二个在shared_ptr,因为它是在GUIObjectsStorage的构造函数中添加的),它们都有引用计数= 1,但两者都指向内存中的同一个对象。然后,如果其中一个死亡,对象本身也会被破坏。

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

shared_ptr

通过隐藏构造函数,我可以确定没有人会以与使用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; } 方法不同的方式创建对象。

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

2 个答案:

答案 0 :(得分:2)

这是工厂制作物品的经典用途。

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

答案 1 :(得分:0)

您可以考虑继承 enable_shared_from_this

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