我正在我的C ++应用程序中创建一个GUI,我有一个名为GUIObject
的类,它是所有其他组件的基类,例如Button
,CheckBox
,{{ 1}}等。
我还有一个类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());
s(一个在这里,第二个在shared_ptr
,因为它是在GUIObjectsStorage
的构造函数中添加的),它们都有引用计数= 1,但两者都指向内存中的同一个对象。然后,如果其中一个死亡,对象本身也会被破坏。
所以我提出了一个想法,可能为从Button
继承的所有类创建私有构造函数,并创建一个静态方法,该方法将创建并返回GUIObject
并将其复制添加到std::shared_ptr
。这样我可以GUIObjectsStorage
s,引用计数= 2,这是正确的:
shared_ptr
通过隐藏构造函数,我可以确定没有人会以与使用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;
}
方法不同的方式创建对象。
但这是设计这个的好方法吗?如果没有,那么这个问题可能是更好的解决方案吗?
答案 0 :(得分:2)
这是工厂制作物品的经典用途。
那就是说,你可能不需要这个。你知道什么时候不再需要小部件吗?像这样的GUI管理员经常这样做。如果是这样,评论者是对的:指定对象的所有者,让它删除它,然后设置。
答案 1 :(得分:0)
您可以考虑继承 enable_shared_from_this 。
然后在您拥有该对象的shared_ptr之后,您可以使用 shared_from_this() 来获取保存该对象的shared_ptr。