我想编写一个“通用”类,表示存储指针的常规容器。我应该使用公共继承还是收容?
template <class T>
class List : public std::vector <T *>
{
//...
}
或者
template <class T>
class List
{
private:
std::vector <T *> items;
//...
}
抽象类(即虚析构函数)可能会出现一些问题吗?
如果两个提案都不合适,我应该遵循什么样的设计(你能举一个简短的例子)吗?
答案 0 :(得分:3)
Boost's pointer containers已经为您完成了这项工作。
我不喜欢boost所以我只想使用C ++ 0x00标准:-)。
- Ian (comment)
如果您仍想重新发明这些课程,请查看他们所做的设计决策。特别是,它们不会像第一个代码那样继承其他容器。
事实上,只需从Boost中复制代码即可。这是一个仅限标头的库,应该是直接的(即很少有特定于实现的解决方法)。 Boost's license非常自由,在分发编译程序时甚至不要求你提及Boost。
答案 1 :(得分:2)
怎么样:
typedef std::vector<boost::shared_ptr<T> > List;
也就是说,我认为在常规容器类中使用资源管理指针比重新发明每个容器类以添加资源管理功能更好。
答案 2 :(得分:0)
private
继承是创建以另一个方式实现的类的常用策略。使用该类的代码无法判断派生类是从私有库派生的,因此您不会在通常需要虚拟析构函数的各种情况下结束。
使用using
将成员从私有库导入到派生类。例如:
template<class T>
class List:
private std::vector<T>
{
public:
using std::vector<T>::operator[];
using std::vector<T>::size;
};
这有点粗糙,但它给你一些灵活性。您可以从使用私有继承开始,与编写转发函数相比,这可以节省一些输入,但您仍然可以根据需要编写替代实现。然后,如果/当这变得不合适时,你可以改变实现风格 - 例如,可能有一个vector
作为成员,或者可以手工完成所有事情 - 在客户代码赢得的知识中安全需要改变。
这非常适合您非常确定最终需要非标准类型的容器,但现有容器类型最适合该帐单的情况。这是一个比typedef
更好的中期解决方案,因为客户代码没有意外(或故意......)使用这两种类型的风险。