结合模板和继承

Combine template and inheritance

本文关键字:继承 结合      更新时间:2023-10-16

我有一个任务来实现几种容器的模板方式在c++中。所有这些容器都应该提供具有各种重载操作符的迭代器。我对模板很陌生,事实上这将是我在这个主题上的第一个真正的项目。

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

继承和模板都不是目标,而且都不好或者本身就是坏的。问题是:你在尝试解决什么问题解决吗?根据a中包含的类型的区别容器应该由模板制作:没有好的如果返回类型是由继承处理的,则返回类型的解决方案。如何管理容器,推进迭代器和结尾的测试是继承的好候选项,但是这在某种程度上还是取决于设计。

你走错方向了。首先创建一些您认为可以工作的替代方案(使用和不使用继承),然后比较它们的优缺点。

或者如果你想不出一方,那你的问题就结束了。

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

在你开始重新发明轮子之前,你应该看看标准和boost中的容器(多索引,指针容器库,图形,…),并尝试适应一个。

您应该从编写更简单的容器开始:堆栈。这很简单,因为堆栈不需要交互器。

我给你写了一个在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;
  }
};

编辑:重命名的基于类,由James指出。