结合模板和继承

时间:2013-06-06 16:49:28

标签: c++ templates inheritance iterator containers

我有一个在c ++中以模板方式实现几种容器的任务。 所有这些容器都应该提供一个迭代器,其中包含各种运算符重载。 我对模板很新,事实上这将是我在这个主题上的第一个真正的项目。

这是我的问题: 在这种情况下,使用带继承的模板是个好主意吗? 它可以用于容器和迭代器吗? 如果是这样,我应该注意什么? 我该怎么办? 任何有关该主题的帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

继承和模板都不是目标,也不是好事 本身还是坏事。问题是:你在尝试什么问题 要解决?根据a中包含的类型区分 容器应该由模板制作:没有好处 返回类型的解决方案,如果它由继承处理。 你如何管理遏制,推进迭代器和 测试结束 是继承的良好候选者,但是 它仍然在某种程度上取决于设计。

答案 1 :(得分:0)

你的方向错误。首先创建一些您认为可以工作的替代方案(有和没有继承),然后将它们作为优点和缺点进行比较。

或者,如果你不能举办一个派对,这样可以很好地解决你的问题。

如果您是模板的新手,我建议从typedef int VALTYPE;开始,并使用它作为常规类来实现容器。测试它,在你完成后你可以替换介绍,所以它将是模板和VALTYPE参数。

答案 2 :(得分:0)

在你开始重新发明轮子之前,你应该看看标准中的容器和加速(MultiindexPointer Container LibraryGraph,...)并尝试调整一个。

答案 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;
  }
};
编辑:詹姆斯指出的重命名的基础课程。