C ++ циклическая зависимость заголовка - PullRequest
0 голосов
/ 09 марта 2011

У меня был вопрос: Предполагается, что у меня есть набор заголовочных / исходных файлов и следующий заголовок:

BaseCharacter.h и BaseCharacter.cpp и EventTypes.h

BaseCharacter.h использует структуры и определения типов, определенные в EventTypes.h, но EventTypes.h должен знать класс BaseCharacter, определенный в BaseCharacter.h. Это создает циклическую зависимость, и я почти уверен, что это мешает моей программе компилироваться. Если я возьму EventTypes.h и все методы, основанные на содержимом EventTypes.h, моя программа скомпилируется нормально. Но если я добавлю EventTypes.h, он и все файлы, ссылающиеся на BaseCharacter.h, будут жаловаться, что не могут найти класс BaseCharacter.

Есть ли способ обойти эту зависимость или это не будет причиной моей проблемы?

Я использую MSVC 2010 в качестве компилятора

Ответы [ 5 ]

4 голосов
/ 09 марта 2011

Форвардная декларация.

В EventTypes.h удалите include и добавьте:

class BaseCharacter;

Обратите внимание, что вы можете использовать только ссылки и указатели на BaseCharacter в EventTypes.h,например, вы не можете иметь структуру с BaseCharacter myChar; переменной-членом.

1 голос
/ 09 марта 2011

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

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

Другим хорошим вариантом было бы извлечь материал, от которого зависят BaseCharacter.h и EventTypes.h, в третий заголовочный файл, который включают первые два; тогда у вас будет только односторонняя зависимость EventTypes.h от BaseCharacter.h.

Третий вариант - просто объединить все в один заголовочный файл; это может иметь или не иметь смысла в зависимости от вашего дизайна, но если взаимозависимости достаточно сильны, то, безусловно, имеет смысл объединенная модель?

0 голосов
/ 09 марта 2011

Раз у меня возникла похожая проблема, решил ее с помощью шаблонов.Не можете ли вы определить EventTypes и / или BaseCharacter как шаблон?

0 голосов
/ 09 марта 2011

Просто чтобы добавить к ответам упоминание предварительного объявления, есть другая альтернатива, которая немного отличается, и она называется PIMPL, что означает «Указатель на имплементацию».Он часто используется вместе с предварительным объявлением, но может использоваться и без.Это не только помогает решить проблемы циклических зависимостей, но также может значительно сократить время сборки и уменьшить зависимость от кода.

0 голосов
/ 09 марта 2011

Вы хотите узнать, как пересылать объявления классов и структур.

См. Здесь: циклическая зависимость между заголовочными файлами

или здесь: Ошибка C ++:«Линия2» не была объявлена ​​

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