【问题标题】:accessing multi-dimensional array element c++访问多维数组元素c ++
【发布时间】:2012-03-04 06:16:31
【问题描述】:

我正在尝试在 MSVS2010 控制台应用程序中使用多维数组,并且我需要访问二维数组的成员。我将数组实例化为

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= 或 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];

我可以不用赋值运算符,但我需要比较运算符才能具有功能。

【问题讨论】:

    标签: c++ visual-studio-2010 multidimensional-array


    【解决方案1】:

    您应该在分配循环中执行:thing[ii][jj] = _thing.thing[ii][jj];。您还应该检查两者(this_thing)的数组大小是否相同:否则可能会导致崩溃。

    您收到一个错误,因为您试图在对象类Thing 上使用operator[](索引运算符),而不是在其内部数组上。如果你想像数组一样使用Thing 类,你应该为它定义一个索引运算符,例如:

    int* Thing::operator[](int idx)
    {
       return thing[idx];
    }
    

    【讨论】:

    • 在程序期间,大小将被视为恒定,但我可以理解引起关注/警报的原因。
    • 严格来说,那个索引操作符其实是错误的。它应该返回int*,因为thing 被定义为int **
    • 我同意@MikeBantegui,但出于不同的原因。在更改之前这是一个更好的答案。我不需要索引运算符,因为它是一个整数数组,并且该运算符是在 std 库中定义的。
    • @gardian06:不,该运算符未在标准库中定义。对于任何用户定义的类,operator[](...) 在您定义之前是未定义的。这就是编译器对你大喊大叫的确切原因。就个人而言,我更愿意用两个参数重载operator()
    【解决方案2】:

    我认为你把你的“东西”弄糊涂了。自:

       Thing& Thing::operator=(const Thing & _thing)
    

    你可能想要:

       thing[ii][jj] = _thing.thing[ii][jj];
    

    _thing 是 Thing 对象

    _thing.thing 是多维数组

    【讨论】:

    • 将考虑重命名 2. 感谢您的说明,但第二次提及答案仅 vodeUp。
    【解决方案3】:

    事物是类,事物是成员,事物是参数...而您忘记了,如果您想在 operator= 调用中访问成员,那么您应该使用 _thing.thing

    您的命名选择非常糟糕,以至于在您编写代码时甚至让自己感到困惑(如果您很容易犯错,现在试着想象一下其他人会更容易感到困惑)通过此代码,甚至在几个月后为您服务)。

    例如调用类Array、成员data 和参数other 怎么样?我还建议避免在名称中使用前导下划线,它们既丑陋又危险(您知道所有 C++ 规则关于可以在名称中放置下划线的位置以及允许使用多少下划线吗?)。

    在设计类或函数时,您需要考虑很多事情,类名或函数名很重要,但也是众多因素之一。但是对于数据成员或变量,您只需选择类型和名称,它们都是最重要的选择。

    所以请养成仔细考虑名称的习惯,尤其是变量。相对重要性对他们来说是巨大的。变量和数据成员只是名称……实际上,名称是我们在编程中喜欢使用变量的唯一原因(计算机只使用数字地址并且对它们非常满意)。

    关于类设计,您可能还想定义operator[](int)...

    int *operator[](int index) { return data[index]; }
    

    通过这样做,您将能够编写类似的代码

    Array a(m);
    a[0][0] = 42;
    

    无需显式引用data(顺便说一下,这个添加也会使您的原始代码工作......但仍然修复名称!!)。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2015-07-05
      • 2020-04-08
      • 1970-01-01
      • 2015-01-26
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多