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

Pio*_*cki 7 c++ oop design-patterns smart-pointers

我创建我的C++应用程序GUI和我有一个叫做类GUIObject是基类的所有其他部件,例如像Button,CheckBox,Window等等.

我也有一个类GUIObjectsStorage,它由GUIObject创建的所有s 组成.到目前为止,我一直在使用原始指针,所以我只是为GUIObject类提供了这个构造函数:

GUIObject::GUIObject() :
{
    GUIObjectsStorage::Instance().addObject(this);
}
Run Code Online (Sandbox Code Playgroud)

它可以满足我的需求,因为无论何时我想访问特定对象,我都是从中获取的GUIObjectsStorage.但现在我正在尝试使用智能指针,所以GUIObjectsStorage现在存储数组std::shared_ptr<GUIObject>而不是原始指针,我不能使用我之前使用过的构造函数:

GUIObject::GUIObject() :
{
    GUIObjectsStorage::Instance().addObject(std::shared_ptr<GUIObject>(this));
}
Run Code Online (Sandbox Code Playgroud)

因为例如:

// Somewhere in code
std::shared_ptr<Button> bt = std::shared_ptr<Button>(new Button());
Run Code Online (Sandbox Code Playgroud)

基本上我现在有两个shared_ptrs(一个在这里,第二个GUIObjectsStorage,因为它是在Button构造函数中添加的),它们都有引用count = 1,但它们都指向内存中的同一个对象.然后,如果其中一个死亡,对象本身也会被破坏.

所以我提出了一个想法,可能为所有继承自的类GUIObject创建私有构造函数,并创建一个静态方法,该方法将创建并返回std::shared_ptr并将其复制添加到GUIObjectsStorage.这样我可以shared_ptr使用引用count = 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;
} 
Run Code Online (Sandbox Code Playgroud)

通过隐藏构造函数,我可以确定没有人会以不同于使用create()方法的方式创建对象.

但这是设计这个的好方法吗?如果没有,对于这个问题,什么可能是更好的解决方案?

Mar*_*ein 2

这是工厂制造对象的经典用法。

也就是说,您可能不需要这个。您知道什么时候不再需要小部件吗?GUI 管理员经常这样做。如果是这样,评论者是对的:指定对象的所有者,让它删除它,然后就可以了。