2010-11-05 3 views
1

Я создаю систему сущностей на основе компонентов для игрового движка.C++: проблема с концептуальной циркуляцией

У меня есть класс сущностей, который должен включать в себя заголовок компонента базового класса для того, чтобы определить массив компонентов private Component* components[ 123 ]

Однако в компоненте базового класса я должен определить private Entity* ownerEntity, beacuse важно что компонент знает, кому он принадлежит!

Это приводит к необходимости Entity.h Component.h и наоборот -> циклическая ссылка

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

ответ

10

До тех пор, как вам нужно только свой класс, чтобы содержать указателей или ссылки к другим классам, вы можете пропустить реальную включаемый файл и использовать пустое опережающее объявление как class Component;.

Вам понадобится полное включение в исходный файл, где вы разыскиваете указатели или используете ссылку для вызова методов на Component.

+0

* Действительно? * Удивительный! – Ricc

+2

На самом деле, потому что в обоих классах вам нужны только указатели, вы можете (должны!) Переслать-заявить иждивенцев, а не включать их в оба заголовка. Ни один из заголовков в этом случае не должен зависеть от другого; это обеспечит сверхбыструю компиляцию. Прополощите и повторите для всех других ссылок, указателей и их аналогов const для каждого класса. ** Также **: прочитайте [что говорит Херб Саттер о зависимостях времени компиляции] (http://www.gotw.ca/gotw/007.htm). – wilhelmtell

+0

Вы можете задуматься слишком далеко - я однажды «умно» объявил auto_ptr , поэтому я мог бы иметь очень низкоуровневый класс, включающий редко используемый метод toString(), возвращающий auto_ptr . Это означает, что вам нужно '#include ' везде, где вы * делаете *, называете это, а ошибки, которые вы получаете от gcc, если вы этого не делаете, вряд ли интуитивно понятны. –

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