【发布时间】:2022-01-03 13:05:42
【问题描述】:
考虑这段代码:
struct MY_VECTOR : public vector<vector<int>>
{
int n = this->size();
int m = (*this)[0].size(); //<== fixed this[0].size()
int at(int i, int j)
{
if (i < 0 || j < 0 || i >= n || j >= m)
return 0;
else
return (*this)[i][j];
}
};
我想访问元素但不抛出任何异常。 (我本可以进行operator[] 重载,但现在对我来说并不重要。)首先,我从未尝试过从 STL 容器继承,所以我什至不确定是否可以这样做。 (我已经读过这通常是一个坏主意,但至少我想试一试)。其次,我什至不确定一切是否会正常工作,因为正如我已经说过的那样,我从未尝试过这样做。所以我尝试创建MY_VECTOR 对象并调用它的构造函数。
struct MY_VECTOR : public vector<vector<int>>
{
int n = this->size();
int m = (*this)[0].size();
int at(int i, int j)
{
if (i < 0 || j < 0 || i >= n || j >= m)
return 0;
else
return (*this)[i][j];
}
};
int main()
{
int n;
cin >> n;
MY_VECTOR a(n, vector<int>(n));
}
它不能编译,我不明白为什么。 vector<vector<int>> 构造函数不是必须继承吗?还是有不同的问题,我没有看到?
编译器错误:“错误 E0289:没有构造函数实例“MY_VECTOR::MY_VECTOR”与参数列表匹配”
【问题讨论】:
-
标题的答案是:不要。如果您想知道为什么代码无法编译,您应该在问题中包含编译器错误
-
this[0].size()应该是(*this)[0].size()但您不检查是否为空。并且无论如何都无法为成员初始化完成。 -
正如其他人之前提到的,STL 模板不是为了继承而来的。如果你想写一个矩阵模板,我建议你谷歌其他人所做的工作,例如Stroustrup 的模板 stroustrup.com/Programming/Matrix/Matrix.h,以及建议的 C++23 多维下标运算符,请参阅 open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2128r6.pdf
标签: c++ oop inheritance constructor