我正在尝试使用MSVS2010控制台应用程序中的多维数组,我需要访问2D数组的成员。我将数组实例化为
Thing::Thing(int _n){
// size of the array
this.m = _n;
thing = new int*[m];
for(int ii = 0; ii < m; ii++){
thing[ii] = new int[m];
}
}
这很好用。虽然我去做一个operator =,或者运算符==两者都使用类似的结构:
Thing& Thing::operator=(const Thing & _thing){
for(int ii = 0; ii < m; ii++){
for(int jj = 0; jj < m; jj++){
thing[ii][jj] = _thing[ii][jj]; //error thrown on this line
}
}
return *this;
}
这会抛出2个错误
binary "[": 'const Thing' does not define this operator or a conversion to a type acceptable to the predefined operator
IntelliSense: no operator"[]" matches these operands
这没有意义,因为它是一个int类型的数组,并且“[]”运算符没有改变,更不用说错误突出显示只是把它放在:
_thing[ii][jj];
我可以在没有赋值运算符的情况下生活,但我需要比较运算符才能具有功能。
答案 0 :(得分:3)
您应该在分配循环中执行:thing[ii][jj] = _thing.thing[ii][jj];
。您还应检查两者(this
和_thing
)的数组大小是否相同:否则可能会导致崩溃。
您收到错误是因为您尝试在对象类operator[]
上使用Thing
(索引运算符),而不是在其内部数组上。如果你想像数组一样使用Thing
类,你应该为它定义一个索引运算符,例如:
int* Thing::operator[](int idx)
{
return thing[idx];
}
答案 1 :(得分:2)
我认为你的“事情”让人感到困惑。时间:
Thing& Thing::operator=(const Thing & _thing)
你可能想要:
thing[ii][jj] = _thing.thing[ii][jj];
_thing是Thing对象
_thing.thing是多维数组
答案 2 :(得分:2)
Thing是类,东西是成员,东西是参数......你忘记了如果你想在operator=
调用中访问成员那么你应该使用_thing.thing
。
你的命名选择非常糟糕,非常糟糕,甚至在你编写代码时都会让自己感到困惑(如果你现在很容易犯错误,那么试着想象一下其他人会更容易混淆通过此代码甚至在几个月后为您提供。)
如果要改为使用类Array
,成员data
和参数other
呢?我还建议避免在名称中使用前导下划线,它们同时也是丑陋和危险的(你知道所有关于你可以在名称中加下下标的C ++规则以及你可以使用多少个?)。 / p>
在设计类或函数时,您需要考虑很多事情,类名或函数名很重要,但却是众多因素之一。但对于数据成员或变量,您只需选择类型和名称,这两者都是最重要的选择。
所以请养成仔细思考名字的习惯,尤其是变量。相对重要性对他们来说是巨大的。变量和数据成员只是名称...这个名称实际上是编程中我们喜欢使用变量的唯一原因(计算机只使用数字地址而且对它们非常满意)。
关于课程设计,您可能还想定义operator[](int)
...
int *operator[](int index) { return data[index]; }
通过这样做,您将能够编写像
这样的代码Array a(m);
a[0][0] = 42;
无需明确引用data
(顺便说一句,此添加也会使您的原始代码正常工作......但仍然可以修复名称!!)。