Перегрузка оператора индекса массива - PullRequest
2 голосов
/ 10 февраля 2011

У меня проблемы с пониманием разницы между Array obj; и Array* obj = new Array; при перегрузке оператора индекса массива []. Когда у меня есть указатель на объект, я получаю эти сообщения об ошибках VS 2010 .

ошибка C2679: двоичный файл '=': не найден оператор, который принимает правый операнд типа 'int' (или нет допустимого преобразования)
может быть 'Array & Array :: operator = (const Array &)' при попытке сопоставить список аргументов '(Array, int)'

#include <iostream>
class Array
{
    int arr[10] ;

    public:
       int& operator[]( int index )
       {
           return arr[index] ;
       }
};

int main()
{
    //Array* obj = new Array; Error

    Array obj;   // Correct
    for( int i=0; i<10; ++i )
        obj[i] = i;

    getchar();
    return 0;
}

Может ли кто-нибудь объяснить обоснование между двумя видами случаев перегрузки операторов? Спасибо.

Ответы [ 2 ]

10 голосов
/ 10 февраля 2011

В случае Array *obj, obj[i] является эквивалентом *(obj+i), поэтому он оценивается в Array объект.

Вам нужно будет сделать

int main()
{
    Array* obj = new Array;

    for( int i=0; i<10; ++i )
        (*obj)[i] = i;

    getchar();
    return 0;
}
1 голос
/ 10 февраля 2011

Вы определили operator[] для Array, а не для Array*. В закомментированном коде вы создаете Array*. Фактически, вы не можете перегрузить оператор для любого типа указателя. Применение [] к указателю обрабатывает его как массив, преобразовывая индексацию массива в арифметику указателя. Таким образом, применение [] к Array* дает Array (на самом деле Array&). Вы не можете назначить int для Array, потому что вы не определили это (и не хотите, чтобы).

Современный, хорошо написанный C ++ использует ключевое слово new очень редко. Вы не должны подозревать, что ваш код C ++ не содержит ключевое слово new. Вы должны быть подозрительными каждый раз, когда это делает !

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