2016-12-22 8 views
1

Извините за плохо определенный заголовок. Что я имею в виду:Как эффективно получить доступ к родительскому объекту родительского объекта?

(Btw Я работаю на движке игры, а А это Scene, B являются игровые объекты и C являются компоненты)

У меня есть 3-х классов : а, в, с

  • а содержит в и в содержит C.
  • а и в имеет ссылку на друг друга.
  • B и C имеют ссылку друг на друга.

(А вперед declarated в заголовке B, и включены в реализации Б)

Это как это: A < -> B < -> C

Моя ситуация такова:

  • Я хочу использовать метод A из C. (Как сообщать основному контейнеру, чтобы добавить другой B и т. Д.)

  • ~ Я хочу сделать функцию многократного использования, которая вызывает метод родителя родительского объекта.

  • Например, в производных классах C мне не нужно заботиться о том, как C достигает A, я просто называю метод C-Re-A-and-do-something.

Мой вопрос заключается в то, что один я должен использовать и почему (или есть лучше один?):

  • В C: GetB() Гета() DoSomething (..)

  • C DoSomething() вызывает DoSomething() B, который вызывает DoSomething A.

Первый выглядит лучше для меня, но в реализации языка C я включаю только заголовок Б, где А является только вперед declarated. Так я не могу использовать методы в без явного включения его в C. (Это плохая практика, или я должен просто включить его?)

Второй имеет большие накладные. Если я хочу использовать X-метод A, мне нужно создать XY-метод в B, который вызывает XY X, и мне нужно создать XY-метод в C, который вызывает XY X.

Так что я не знаю, как мне достичь более высоких элементов в иерархии из нижних элементов.

Какое оптимальное решение для этого?

+0

Добавляет ли заголовочный файл для файла A в файл C конфликты? –

+0

'GetB(). GetA(). DoSomething()' кажется лучше. Вы можете включить A на C, просто убедитесь, что ваши определения и декларации разделены и включены. Другим вариантом может быть использование 'std :: functional', а затем инициализация B с помощью функции из A и ее копирование в переменную' std :: functional' в C, чтобы C затем мог просто вызвать 'my_std_functional()', что делает что-то в A. – wally

+0

Это прекрасно работает. Не могли бы вы дать мне более подробную информацию о «определениях и декларациях разделены и включены»? Если каждый класс находится в другом пространстве, то это не проблема, не так ли? – Tudvari

ответ

0

В C:.. GetB() Гета() DoSomething()

C в DoSomething() вызывает Б DoSomething(), который вызывает DoSomething в.

Я думаю, что оба ошибочны, поскольку с архитектурной точки зрения такой подход создает сильную связь между классами. Рассмотрите возможность использования диспетчера событий, который реализует шаблон Observer для вашей логики. Пусть компоненты отправляют события друг другу, а также реагируют на них.

Я не уверен, как эта работа будет работать в вашем случае, но я настоятельно рекомендую против premature optimization, если это не очевидно.

+0

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