关于多态性的程序设计&资源管理

时间:2016-12-21 05:30:53

标签: c++ polymorphism resource-management

我有一个名为Widget的班级。这个类是抽象的,并且有虚方法。为避免对象切片,所有Widgets都存储为引用或指针。我有几个带有构造函数的类,它们在内部存储给它们的小部件;因此,存储的Widget必须在构造函数之外初始化,并且在对象之前不能销毁,因此通常通过动态内存分配Widget。我的问题是关于如何处理这种动态内存;我已经编制了一个选项列表(随意建议其他人。)哪个是最惯用的?

1。智能指针。智能指针似乎是正确的选择,但由于我使用的是C ++ 98,我必须自己编写。我也认为一直写smart_pointer<Widget>有点难看。

2。存储时复制Widgets另一种操作方法是存储传入的Widget而不是原始的副本。这可能导致对象切片,但我不确定。此外,用户可能希望自己编写存储传入Widgets的类,我不想让它过于复杂。

第3。让用户处理所有事情。我或许可以让用户确保按时删除Widget。这似乎是Qt所做的(?)。但是,这再次使用户感到困惑。

3 个答案:

答案 0 :(得分:1)

我个人喜欢这种方法(它并不总是适用,但我多次成功使用它):

class WidgetOwner
{
     vector<Widget*> m_data;
public:
     RegisterWidget(Widget *p) { m_data.push_back(p); }
     ~WidgetOwner() { for (auto &p : m_data) delete p; }
};

这个简单的类只存储指针。如果Widget具有虚拟析构函数,则此类可以存储Widget的任何导数。对于多态类,这应该不是问题。

请注意,一旦注册了Widget,除非所有内容都被销毁,否则无法销毁它。

这种方法的优点是你可以自由地传递指针。它们都将有效,直到存储将被销毁。这是一种手工制作的游泳池。

答案 1 :(得分:1)

  

哪个是最惯用的?

最惯用的当然是下一版本的c ++决定&#34;前进的方式&#34;,那将是智能指针(你可以找到/使用一个实现例如,在互联网上的其他因素也可能更灵活。)

您也可以决定,因为您使用的是c++98(这是一个需要考虑的重要因素),您可以选择适合该情境的惯用语,因为这几乎不是男人的土地,答案很可能是家庭设计最吸引你的。

答案 2 :(得分:0)

我认为智能指针是最佳选择。如果您认为模板很难看,请尝试typedef