Два класса, которые относятся друг к другу

Я новичок в С++, поэтому этот вопрос может быть основным:

У меня есть два класса, которые должны ссылаться друг на друга. Каждый из них имеет собственный заголовочный файл и # включает другой заголовочный файл. Когда я пытаюсь скомпилировать, я получаю ошибку "ISO С++ запрещает объявление" Foo без типа "для одного из классов. Если я переключу все так, что противоположный заголовок будет разобран сначала, я получаю ту же ошибку с другим классом.

Возможно ли, что в С++ есть два класса, которым нужны ссылки друг другу?

Для более подробной информации: у меня есть класс "App" и "Window". Приложение должно обратиться к окну, чтобы сделать это окно. Окно имеет кнопку, которая возвращает приложение, поэтому ему нужна ссылка на приложение. Если я не могу иметь два класса, ссылающихся друг на друга, есть ли лучший способ реализовать это?

Ответы

Ответ 1

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

class App;

В App.h добавьте эту строку:

class Window;

Добавьте эти строки перед определениями классов.

Затем в исходных файлах вы можете включать заголовки для фактических определений классов.

Если ваши определения классов ссылаются на элементы другого класса (например, в строках), то их необходимо перенести в исходный файл (более не встроенный).

Ответ 2

Форвардная декларация - это путь.

Если вы используете указатели \reference в заголовке класса, тогда для вас будет работать декларация Forward с обеих сторон.

Если вы создаете объект как член класса, тогда вы должны включить заголовок. (Объявление Forward не будет работать, поскольку компилятору необходимо определить класс для определения размера).

Обратитесь к частому варианту С++ для решения такого сенарио:

Если вы создаете Window как член, тогда включайте заголовок Window в приложении, но в то же время Окно не должно включать заголовок приложения. Используйте комбинацию указателя на приложение и там, где есть прямая декларация.