我正在我的 C++ 应用程序中创建一个 GUI,我有一个名为 GUIObject
的类这是所有其他组件的基类,例如 Button
, CheckBox
, 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());
基本上我现在有两个 shared_ptr
s(这里是一个,在 GUIObjectsStorage
中是第二个,因为它是在 Button
的构造函数中添加的)它们的引用计数 = 1,但都指向内存中的同一个对象。然后,如果其中一个死亡,对象本身也会被销毁。
所以我想出了一个想法,也许可以为所有继承自 GUIObject
的类创建私有(private)构造函数。并创建一个静态方法,该方法将创建并返回 std::shared_ptr
并将其复制添加到 GUIObjectsStorage
.这样我就可以拥有 shared_ptr
引用计数 = 2 的 s 是正确的:
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()
的方式创建对象。方法。
但这是设计这个的好方法吗?如果不是,对于这个问题有什么更好的解决方案?
最佳答案
这是工厂制作对象的经典用法。
也就是说,您可能不需要这个。您知道什么时候不再需要小部件吗?像这样的 GUI 管理员经常这样做。如果是这样,评论者是对的:指定对象的所有者,让它删除它,然后就可以了。
关于c++ - 创建对象而不是构造函数的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15596787/