доступ к многомерному элементу массива c ++ - PullRequest
3 голосов
/ 04 марта 2012

Я пытаюсь работать с многомерным массивом в консольном приложении 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];
    }
}

это работает нормально. хотя, когда я иду делать оператор = или оператор ==, оба используют похожую структуру:

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

Я могу жить без оператора присваивания, но мне нужен оператор сравнения, чтобы иметь функциональность.

Ответы [ 3 ]

3 голосов
/ 04 марта 2012

Вы должны сделать: thing[ii][jj] = _thing.thing[ii][jj]; в цикле присваивания.И вам также следует проверить, одинаковы ли размеры массивов (this и _thing): в противном случае это может привести к сбою.

Вы получаете ошибку, потому что пытаетесь использовать operator[](оператор индексации) для класса объекта Thing, а не для его внутреннего массива.Если вы хотите использовать класс Thing как массив, вы должны определить для него оператор индексации, например:

int* Thing::operator[](int idx)
{
   return thing[idx];
}
2 голосов
/ 04 марта 2012

Это класс, вещь - член, вещь - параметр ... и вы забыли, что если вы хотите получить доступ к члену в вызове operator=, вам следует использовать _thing.thing.

Ваш выбор имен довольно плох, настолько плох, что он даже запутал вас, когда вы писали код (и если вам было легко ошибиться, попробуйте представить, насколько проще было бы кому-то другому запутаться в этом кодеили даже для вас через несколько месяцев).

А как насчет вызова, например, класса Array, члена data и параметра other?Я также предложил бы избегать использования начальных подчеркиваний в именах, они уродливы и опасны одновременно (знаете ли вы все правила C ++ относительно того, где можно ставить подчеркивания в именах и сколько из них вам разрешено использовать?).

При разработке класса или функции вам нужно учесть много вещей, и имя класса или имя функции важно, но это один из многих факторов.Но для элемента данных или переменной вам нужно только выбрать тип и имя, и оба они являются наиболее важными.

Поэтому, пожалуйста, приобретите привычку внимательно относиться к именам, особенно к переменным.Относительная важность для них огромна.Переменные и члены-данные - это просто имена ... имя - фактически единственная причина, по которой в программировании нам нравится использовать переменные (вместо этого компьютер использует только числовые адреса и совершенно им доволен).

Одизайн класса вы, вероятно, также хотели бы определить operator[](int) ...

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

Таким образом вы сможете писать код, подобный

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

без необходимости явно ссылаться наdata (и, кстати, это дополнение также сделает ваш оригинальный код работающим ... но все же исправит имена !!).

2 голосов
/ 04 марта 2012

Я думаю, вы запутались.Поскольку:

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

вы, вероятно, хотите иметь:

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

_thing - это объект Thing

_thing.thing - это многомерный массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...