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

8
我正在尝试创建一个名为tableaux的对象类,这些对象本质上是无符号整数的向量的向量(它们类似于矩阵,但行可以是不同的长度),并使用我的一些算法。主要问题是我想从vector类继承这些对象的迭代器,但我不知道如何实现。
我已经阅读了几个相关的问题和答案,很容易让我公开继承std::vector>,但共识是由于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 ++,所以如果我做错了什么,请温柔点。如果你需要更多我编写的实际代码,请告诉我。

3
总的来说,这是一个非常好的测试案例。干得好。 :) - Lightness Races in Orbit
1个回答

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,所以只需记录没有人应该尝试这样做,你就可以了。

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


好的,现在组合的概念更加清晰了,谢谢。我想在这种情况下我会坚持使用继承。 - Chris Brooks
@Joseph:我认为那是明智的。 - Lightness Races in Orbit
+1 继承容器并不像有些人试图让它看起来那么糟糕。 - jrok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接