Два класса, которые относятся друг к другу
Я новичок в С++, поэтому этот вопрос может быть основным:
У меня есть два класса, которые должны ссылаться друг на друга. Каждый из них имеет собственный заголовочный файл и # включает другой заголовочный файл. Когда я пытаюсь скомпилировать, я получаю ошибку "ISO С++ запрещает объявление" Foo без типа "для одного из классов. Если я переключу все так, что противоположный заголовок будет разобран сначала, я получаю ту же ошибку с другим классом.
Возможно ли, что в С++ есть два класса, которым нужны ссылки друг другу?
Для более подробной информации: у меня есть класс "App" и "Window". Приложение должно обратиться к окну, чтобы сделать это окно. Окно имеет кнопку, которая возвращает приложение, поэтому ему нужна ссылка на приложение. Если я не могу иметь два класса, ссылающихся друг на друга, есть ли лучший способ реализовать это?
Ответы
Ответ 1
Вы можете использовать форвардные объявления в файлах заголовков для обхода круговых зависимостей, если у вас нет зависимостей реализации в заголовках. В Window.h добавьте эту строку:
class App;
В App.h добавьте эту строку:
class Window;
Добавьте эти строки перед определениями классов.
Затем в исходных файлах вы можете включать заголовки для фактических определений классов.
Если ваши определения классов ссылаются на элементы другого класса (например, в строках), то их необходимо перенести в исходный файл (более не встроенный).
Ответ 2
Форвардная декларация - это путь.
Если вы используете указатели \reference в заголовке класса, тогда для вас будет работать декларация Forward с обеих сторон.
Если вы создаете объект как член класса, тогда вы должны включить заголовок. (Объявление Forward не будет работать, поскольку компилятору необходимо определить класс для определения размера).
Обратитесь к частому варианту С++ для решения такого сенарио:
Если вы создаете Window как член, тогда включайте заголовок Window в приложении, но в то же время Окно не должно включать заголовок приложения. Используйте комбинацию указателя на приложение и там, где есть прямая декларация.
Ответ 3
Вам нужно форвардная декларация.