我有一个称为 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