Типовое приведение указателей к указателям - PullRequest
0 голосов
/ 03 марта 2020

У меня есть следующие элементы.

p1: указатель на объединение классов.

r1 указатель внутри объединения классов, который указывает на класс области.

A.x Точка внутри класса Rectangle.

Union и Rectangle являются производными классами от базового класса Region.

Я выполняю следующую операцию.

auto p1 = new Union();
p1->r1 = new Rectangle();

Теперь я хочу изменить точку внутри r1.

Как я могу ввести указатель внутри указателя, например, я попробовал это, и это не работает.

p1->(Rectangle*)r1->B.x = 6;

Однако это прекрасно работает,

auto r11 = (Rectangle*)p1->r1;
r11->A.x = 1;

Как изменить p1->(Rectangle*)r1->B.x = 6;, чтобы напрямую изменить Ax без создания нового указателя?

1 Ответ

3 голосов
/ 03 марта 2020

Вам нужно проверить приоритет оператора и его ассоциативность. https://en.cppreference.com/w/cpp/language/operator_precedence

Правильная форма:

((Rectangle*)p1->r1)->B.x = 6;

Чтобы быть более точным, вот как это работает:

  1. Доступ Прямоугольник * член r1 с -> (слева направо)
  2. Приведите его к прямоугольнику * (справа налево)
  3. Доступ к элементу B (слева направо). Примите во внимание, что -> имеет более высокий приоритет, чем приведение (Rectangle*), поэтому у нас есть круглые скобки в ((Rectangle*)p1->r1).
  4. Доступ к члену через. оператор
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...