1

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

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

4

4 回答 4

3

继承和模板都不是目标,本身也没有好坏之分。问题是:你想解决什么问题?根据容器中包含的类型进行区分应该由模板来进行:如果返回类型通过继承处理,则没有好的解决方案。如何管理包含、推进迭代器和测试结束继承的良好候选者,但它仍然在一定程度上取决于设计。

于 2013-06-06T17:47:21.780 回答
0

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

或者,如果你不能想出一个聚会,那你的问题就结束了。

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

于 2013-06-06T16:56:46.587 回答
0

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

于 2013-06-06T17:04:27.473 回答
-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;
  }
};

编辑:正如詹姆斯所指出的,重命名了基础类。

于 2013-06-06T17:08:55.523 回答