我有一个名为Widget
的班级。这个类是抽象的,并且有虚方法。为避免对象切片,所有Widgets
都存储为引用或指针。我有几个带有构造函数的类,它们在内部存储给它们的小部件;因此,存储的Widget
必须在构造函数之外初始化,并且在对象之前不能销毁,因此通常通过动态内存分配Widget
。我的问题是关于如何处理这种动态内存;我已经编制了一个选项列表(随意建议其他人。)哪个是最惯用的?
1。智能指针。智能指针似乎是正确的选择,但由于我使用的是C ++ 98,我必须自己编写。我也认为一直写smart_pointer<Widget>
有点难看。
2。存储时复制Widgets
。另一种操作方法是存储传入的Widget
而不是原始的副本。这可能导致对象切片,但我不确定。此外,用户可能希望自己编写存储传入Widgets
的类,我不想让它过于复杂。
第3。让用户处理所有事情。我或许可以让用户确保按时删除Widget
。这似乎是Qt所做的(?)。但是,这再次使用户感到困惑。
答案 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