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