如何从STL类“继承”迭代器?

时间:2014-01-16 19:11:15

标签: c++ class inheritance stl iterator

我正在尝试创建一个名为tableaux的对象类,它们本质上是无符号整数向量的向量(它们就像矩阵,但行可以是不同的长度),我已经编写了一些算法。主要问题是我想从vector类继承这些对象的迭代器,我不知道如何。

我已经阅读了几个相关的问题和答案,而且我很容易公开继承std::vector<std::vector<unsigned int> >,但大家一致认为这是因为STL容器没有虚拟析构函数或其他原因。所以我决定尝试通过构图“继承”。这是我想要实现的一个极小的例子:

#include <vector>
#include <iostream>

class tableau {
  private:
    std::vector<std::vector<unsigned int> > rep;
  public:
    using std::vector<std::vector<unsigned int> >::iterator;
    void push_back(std::vector<unsigned int> const& new_row) {
      rep.push_back(new_row);
    }
};

int main() {
  tableau t1;
  std::vector<unsigned int> row1(10);
  std::vector<unsigned int> row2(8);

  t1.push_back(row1);
  t1.push_back(row2);

  tableau::iterator it = t1.begin();
  for ( ; it != t1.end(); ++it) {
    //display rows of tableau
  }
  return 0;
}

但是g ++给了我错误:类型'std::vector<std::vector<unsigned int> >'不是类型'tableau'的基类型。我刚开始学习C ++,所以如果我做了一些愚蠢的事情,请保持温和。如果你想要更多我写的实际代码,请告诉我。

1 个答案:

答案 0 :(得分:10)

您的第一个问题是using不允许您从任意不相关的类型中窃取类型(尽管您可以使用typedef)。此外,您没有begin()end()成员。

解决这些问题会产生以下结果:

#include <vector>
#include <iostream>

class tableau {
  private:
    std::vector<std::vector<unsigned int> > rep;
  public:
    typedef std::vector<std::vector<unsigned int> >::iterator iterator;
    void push_back(std::vector<unsigned int> const& new_row) {
      rep.push_back(new_row);
    }
    iterator begin() { return rep.begin(); }
    iterator end()   { return rep.end();   }
};

int main() {
  tableau t1;
  std::vector<unsigned int> row1(10);
  std::vector<unsigned int> row2(8);

  t1.push_back(row1);
  t1.push_back(row2);

  tableau::iterator it = t1.begin();
  for ( ; it != t1.end(); ++it) {
    //display rows of tableau
  }
  return 0;
}

但是,你的方法意味着你必须包装你想要调用的每个函数。

如果我是你,我会坚持继承:虽然你引用的建议是正确的,但这并不意味着继承是不可能的。你永远不会想要通过指针到基础来多态地使用你的tableau,所以简单地记录一下没有人应该尝试这样做,你会没事的。

(当你使用“作曲”时,它被称为“作曲”。你在问如何“组合”向量。)