静态方法来创建对象而不是构造函数
Static method to create an object instead of constructor
我在我的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。
- 通过构造函数创建的所有对象都具有相同的向量
- 通过向构造函数其他对象引用页面来创建对象
- C++ 创建不带默认构造函数的对象数组
- 尝试使用构造函数创建对象时出错
- 为什么私有构造函数阻止对象创建C++
- C++ - 类构造函数创建对象,但构造的结果不同
- 创建独立于构造函数的对象指针
- 我们可以说构造函数创建对象
- 如何使用在另一个类的构造函数中的堆栈上接受参数的构造函数创建对象
- 正在中断构造函数中对象的创建
- 构造函数创建const对象
- 使用基构造函数创建派生对象
- 创建一个具有空构造函数的对象
- 使用函数中的复制构造函数创建实例的副本,该函数获取作为基对象传递的实例
- 递增由向 boost::p ython 公开的构造函数创建的对象的引用计数
- 创建一个没有默认构造函数的对象数组
- 通过使用不同的构造函数创建对象,并最终释放对象的内存
- 构造函数和对象创建中的"this"
- 使用构造函数创建对象时出错
- 如何使用带参数的构造函数创建对象