我正在我的 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_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()方法不同的方式创建对象。
但这是设计这个的好方法吗?如果没有,有什么更好的解决方案来解决这个问题?