我在我的c++应用程序中创建了一个GUI,我有一个名为GUIObject
的类,它是所有其他组件的基类,例如Button
, CheckBox
, Window
等。
我也有一个类GUIObjectsStorage
,它由所有创建的GUIObject
组成。到目前为止,我一直在使用原始指针,所以我只有GUIObject
类的这个构造函数:
GUIObject::GUIObject() :
{
GUIObjectsStorage::Instance().addObject(this);
}
这对我的需要来说是ok的,因为每当我想访问特定的对象时,我就从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_ptr
(一个在这里,第二个在GUIObjectsStorage
,因为它是在Button
的构造函数中添加的),它们都有引用计数= 1,但都指向内存中的同一个对象。如果其中一个死亡,对象本身也将被销毁。
所以我想出了一个主意,也许为继承GUIObject
的所有类创建私有构造函数,并创建一个静态方法,创建并返回std::shared_ptr
,并将其复制添加到GUIObjectsStorage
。这样我就可以有shared_ptr
s引用计数= 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()
方法。
但是这是设计的好方法吗?如果不是,有什么更好的解决方案吗?
这是Factory用于制造对象的经典用法。
也就是说,您可能不需要这个。你知道什么时候不再需要小部件了吗?像这样的GUI管理器经常会这样做。如果是这样,评论者是正确的:指定对象的所有者,让它删除它,然后就可以设置了。
您可以考虑从继承enable_shared_from_this
然后,当你有一个shared_ptr到对象后,你可以使用shared_from_this()来获取保存对象的shared_ptr。