我正在尝试创建一个名为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 ++,所以如果我做了一些愚蠢的事情,请保持温和。如果你想要更多我写的实际代码,请告诉我。
答案 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
,所以简单地记录一下没有人应该尝试这样做,你会没事的。
(当你使用“作曲”时,它被称为“作曲”。你在问如何“组合”向量。)