подстрочный оператор по указателям - PullRequest
12 голосов
/ 11 мая 2010

Если у меня есть указатель на объект с перегруженным оператором индекса ([]), почему я не могу сделать это:

 MyClass *a = new MyClass();
 a[1];

но вместо этого нужно сделать это:

 MyClass *a = new MyClass();
 (*a)[1];

Ответы [ 4 ]

16 голосов
/ 11 мая 2010

Это потому, что вы не можете перегрузить операторы для типа указателя; Вы можете перегрузить только оператор, в котором хотя бы один из параметров (операндов) имеет тип класса или тип перечисления.

Таким образом, если у вас есть указатель на объект некоторого типа класса, который перегружает оператор индекса, вы должны разыменовать этот указатель, чтобы вызвать его перегруженный оператор индекса.

В вашем примере a имеет тип MyClass*; это тип указателя, поэтому используется встроенный operator[] для указателей. Когда вы разыменовываете указатель и получаете MyClass, у вас есть объект типа класса, поэтому используется перегруженный operator[].

7 голосов
/ 11 мая 2010

Потому что a это указатель типа на MyClass, а не MyClass. Изменение языка для поддержки желаемого использования может нарушить семантику многих других языков.

Вы можете получить нужный синтаксический результат:

struct foo {
    int a[10];
    int& operator [](int i) { return a[i]; }
};

main() {
    foo *a = new foo();
    foo &b = *a;
    b[2] = 3;
}
3 голосов
/ 11 мая 2010

Проще говоря, с a[1] указатель a обрабатывается как массив, содержащий память, и вы пытаетесь получить доступ ко второму элементу в массиве (который не существует).

(*a)[1] заставляет сначала получить фактический объект в местоположении указателя, (*a), а затем вызвать на нем оператор [].

1 голос
/ 03 ноября 2016

Хорошие новости. Вы также можете сделать ...

а-> оператор [] (1);

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

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

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