我有一个在c ++中以模板方式实现几种容器的任务。 所有这些容器都应该提供一个迭代器,其中包含各种运算符重载。 我对模板很新,事实上这将是我在这个主题上的第一个真正的项目。
这是我的问题: 在这种情况下,使用带继承的模板是个好主意吗? 它可以用于容器和迭代器吗? 如果是这样,我应该注意什么? 我该怎么办? 任何有关该主题的帮助将不胜感激。
答案 0 :(得分:3)
继承和模板都不是目标,也不是好事 本身还是坏事。问题是:你在尝试什么问题 要解决?根据a中包含的类型区分 容器应该由模板制作:没有好处 返回类型的解决方案,如果它由继承处理。 你如何管理遏制,推进迭代器和 测试结束 是继承的良好候选者,但是 它仍然在某种程度上取决于设计。
答案 1 :(得分:0)
你的方向错误。首先创建一些您认为可以工作的替代方案(有和没有继承),然后将它们作为优点和缺点进行比较。
或者,如果你不能举办一个派对,这样可以很好地解决你的问题。
如果您是模板的新手,我建议从typedef int VALTYPE;
开始,并使用它作为常规类来实现容器。测试它,在你完成后你可以替换介绍,所以它将是模板和VALTYPE参数。
答案 2 :(得分:0)
在你开始重新发明轮子之前,你应该看看标准中的容器和加速(Multiindex,Pointer Container Library,Graph,...)并尝试调整一个。
答案 3 :(得分:-1)
您应该从编写更简单的容器开始:堆栈。这很简单,因为堆栈不需要交互器。
我给你写了一个在std :: list之上实现的堆栈的小例子,有一些继承。
首先尝试自己编写,但如果你愿意,你可以看一下这个。
#include <iostream>
#include <list>
/* Here mainly to demonstrate inheritance by providing a stack interface */
template<typename T>
class IStack
{
public:
virtual void push(const T &i) = 0;
virtual T& pop() = 0;
};
template<typename T>
class Stack : public IStack<T>
{
private:
std::list<T> _internal;
public:
virtual void push(const T &i)
{
_internal.push_back(i);
}
virtual T& pop()
{
T& tmp = _internal.back();
_internal.pop_back();
return tmp;
}
};
编辑:詹姆斯指出的重命名的基础课程。