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

Static method to create an object instead of constructor

本文关键字:构造函数 创建对象 静态方法      更新时间:2023-10-16

我在我的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。