c++ - 创建对象而不是构造函数的静态方法

标签 c++ oop design-patterns smart-pointers

我正在我的 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/

相关文章:

c++ - std 容器的模板 typedef(没有专门化)?

c++ - 将 C++ 应用程序部署到 Google Cloud Platform Kubernetes 引擎

javascript - 结构化 javascript 变量声明中的自引用

java - 枚举而不是 Java 中的普通类

c++ - 使用 Qt 编写安全的服务器应用程序

c++ - 返回类(class)成员时遇到麻烦

javascript - OOP JavaScript - 初学者示例

javascript - 这种在 javascript 中调用 super() 的方法有什么问题吗?

ruby-on-rails - 为移动和网络构建后端

C#耦合类——强类型结构设计