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



我有一个称为 Widget的类。该类是抽象的,具有虚拟方法。为避免对象切片,所有Widgets被存储为引用或指针。我有几个类别的构造函数,可以在内部存储给他们的小部件。因此,存储的Widget必须是在构造函数之外初始初始化的,并且在对象为之前不能被破坏,因此通常通过动态内存分配Widget。我的问题是如何处理这种动态记忆;我已经编制了一个选项列表(随时建议其他人。)哪个是最惯用的?

1。智能指针。智能指针似乎是正确的选择,但是由于我使用的是C 98,所以我必须写自己的。我还认为写smart_pointer<Widget>一直有点丑陋。

2。复制Widgets存储时。另一个动作过程是存储传递的Widget的副本,而不是原件。这可能会导致对象切片,但我不确定。另外,用户可能想自己写上课的课程,以存储传递的Widgets,我不想使它变得太复杂。

3。让用户处理所有内容。我也许可以使用户确保按时删除Widget。这似乎是QT所做的(?)。但是,这再次使用户变得复杂。

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

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的任何衍生物。对于多态类别,这不是问题。

请注意,一旦登记了小部件,除非一切都被销毁,否则它就不能被销毁。

这种方法的优点是您可以自由地传递指针。它们都将有效,直到存储将被破坏为止。这是一种手工池。

哪个是最惯用的?

最惯用的是C 的下一个版本决定是"要走的方式",那将是智能指针(您可以在Boost上找到/使用实现,例如互联网上的其他互联网上可能会更简单地灵感)。

您还可以决定,由于您使用的是c++98(这是要考虑的一个重要因素),因此您要对这种情况进行惯用性,而且由于这几乎没有人的土地,因此答案很可能是任何自制的家庭。设计对您最吸引人。

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

相关内容

  • 没有找到相关文章

最新更新