2011-02-10 2 views
2

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

ошибка C2679: бинарная «=»: ни один оператор не найден, который принимает правого операнд типа «Int» (или нет приемлемого преобразования)
может быть «Массив & Массива :: Оператора = (Const Массив &)»при попытке соответствовать списку аргументов„(массив, 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; 
} 

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

+0

Похожее: http://stackoverflow.com/questions/2808030/subscript-operator-on-pointers – coelhudo

ответ

10

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

Вы должны сделать

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

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

    getchar(); 
    return 0; 
} 
+2

«поэтому он оценивает объект Array» - очень странное и неопределенное утверждение. Я бы сказал, что предполагается, что obj является первым в смежном массиве массивов и перемещается в (i + 1) th (индексирование массива основано на 0). Тогда случается так, что он пытается назначить i непосредственно в объект Array по этому адресу, и нет конструктора 'Array :: operator = (int)' или 'Array (int)', так что это невозможно. Точно так же :-), поскольку такая тихая ошибка создавала бы неопределенное поведение во время выполнения и было бы труднее заметить и исправить. –

1

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

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

Смежные вопросы