我的任务是在 C++ 中以模板方式实现几种容器。所有这些容器都应提供具有各种运算符重载的迭代器。我对模板很陌生,事实上这将是我在这个主题上的第一个真正的项目。
这是我的问题:在这种情况下,使用带有继承的模板是个好主意吗?容器和迭代器都可以这样做吗?如果是这样,我应该注意什么?我不应该做什么?任何有关该主题的帮助将不胜感激。
我的任务是在 C++ 中以模板方式实现几种容器。所有这些容器都应提供具有各种运算符重载的迭代器。我对模板很陌生,事实上这将是我在这个主题上的第一个真正的项目。
这是我的问题:在这种情况下,使用带有继承的模板是个好主意吗?容器和迭代器都可以这样做吗?如果是这样,我应该注意什么?我不应该做什么?任何有关该主题的帮助将不胜感激。
继承和模板都不是目标,本身也没有好坏之分。问题是:你想解决什么问题?根据容器中包含的类型进行区分应该由模板来进行:如果返回类型通过继承处理,则没有好的解决方案。如何管理包含、推进迭代器和测试结束是继承的良好候选者,但它仍然在一定程度上取决于设计。
你从错误的方向开始。首先创建一些您认为可行的替代方案(有和没有继承),然后比较它们的优缺点。
或者,如果你不能想出一个聚会,那你的问题就结束了。
如果您不熟悉模板,我建议您从 typedef int VALTYPE;
使用它作为常规类开始并实现容器。测试它,完成后你可以替换介绍,所以它是模板和 VALTYPE 一个参数。
在开始重新发明轮子之前,您应该查看标准和 boost 中的容器(Multiindex、Pointer Container Library、Graph ......)并尝试调整一个。
您应该从编写更简单的容器开始:堆栈。这很简单,因为堆栈不需要插入器。
我给你写了一个在 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;
}
};
编辑:正如詹姆斯所指出的,重命名了基础类。