C++ 如何";继承;来自STL类的迭代器?

C++ 如何";继承;来自STL类的迭代器?,c++,class,inheritance,stl,iterator,C++,Class,Inheritance,Stl,Iterator,我正在尝试创建一类名为tableaux的对象,它本质上是无符号整数向量的向量(它们类似于矩阵,只是行的长度可能不同),使用我编写的一些算法。主要问题是我想从vector类继承这些对象的迭代器,但我不知道如何继承 我已经阅读了一些相关的问题和答案,我很容易公开继承std::vector,但普遍认为这是不好的,因为STL容器没有虚拟析构函数或其他什么。所以我决定尝试通过构图“继承”。以下是我试图实现的一个小例子: #include <vector> #include <iostre

我正在尝试创建一类名为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;
}
#包括
#包括
课堂画面{
私人:
std::向量rep;
公众:
使用std::vector::迭代器;
无效推回(标准::向量常量和新行){
代表推回(新行);
}
};
int main(){
表t1;
标准::向量行1(10);
标准::向量行2(8);
t1.向后推(第1行);
t1.推回(第2行);
tableau::迭代器it=t1.begin();
for(;it!=t1.end();++it){
//显示一行行的画面
}
返回0;
}

但是g++给了我一个错误:类型“
std::vector
”不是类型“tableau”的基类型。我刚开始学C++,所以如果我做了蠢事就请温柔点。如果您想要更多我编写的实际代码,请告诉我。

您的第一个问题是
使用
不允许您从任意不相关的类型中窃取类型(尽管您可以使用
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;
}
#包括
#包括
课堂画面{
私人:
std::向量rep;
公众:
typedef std::vector::迭代器迭代器;
无效推回(标准::向量常量和新行){
代表推回(新行);
}
迭代器begin(){return rep.begin();}
迭代器end(){return rep.end();}
};
int main(){
表t1;
标准::向量行1(10);
标准::向量行2(8);
t1.向后推(第1行);
t1.推回(第2行);
tableau::迭代器it=t1.begin();
for(;it!=t1.end();++it){
//显示一行行的画面
}
返回0;
}
然而,您的方法意味着您必须包装要调用的每个函数

如果我是你,我会坚持继承:尽管你引用的建议是正确的,但这并不意味着继承是不可能的。您永远不会希望通过指向base的指针以多态方式使用
表,所以只需编写文档,任何人都不应该尝试这样做,您就会没事了


(当你使用“合成”时,它被称为“合成”。你问的是如何“合成”向量。)

一般来说,这是一个非常好的测试用例。干得好。:)好的,现在作曲的概念更有意义了,谢谢。在这种情况下,我想我会坚持继承。@Joseph:我认为这是明智的。+1容器的继承并不像一些人试图做到的那样糟糕。