我正在我的 C++ 应用程序中创建一个 GUI,我有一个名为的类GUIObject
,它是所有其他组件的基类,例如Button
,CheckBox
等Window
。
我还有一个 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_ptr
s (一个在这里,第二个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()
方法不同的方式创建对象。
但这是设计这个的好方法吗?如果没有,有什么更好的解决方案来解决这个问题?