Заявление включает в себя

0

У меня есть 2 файла, которые используют друг друга в них, поэтому я пытаюсь включить каждый из них в каждый файл, что не работает, потому что файлы будут включать в себя сами. Я попытался помещать соответствующие инструкции include внутри защитников заголовков, но это заставляет компилятор думать, что все имена переменных являются идентификаторами типа.

Вот то, что у меня есть, когда оно внутри защитников заголовка

//MenuItem.h
#include <SDL.h>
#include <string>

#ifndef MENU_ITEM_H  //avoid multiple inclusion
#define MENU_ITEM_H

#include "window.h"
class MenuItem {
    bool selected = false;
    window containerWindow;
    etc

Window.h включает в себя MenuItem.h внутри защиты заголовка.

В MenuItem.h я получаю такие ошибки, как

Error   1   error C2146: syntax error : missing ';' before identifier 'containerWindow' 
Error   2   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   

Когда у меня они есть у внешних охранников (например, так)

//MenuItem.h
#include <SDL.h>
#include <string>
#include "window.h"

#ifndef MENU_ITEM_H  //avoid multiple inclusion
#define MENU_ITEM_H

class MenuItem {
    bool selected = false;
    window containerWindow;
    etc

Я получаю следующее

Error   1   error C1014: too many include files : depth = 1024

Я не знаю, как я могу это исправить.

  • 0
    У вас есть соответствующий #endif я подозреваю?
  • 1
    Что вам действительно нужно сделать, так это исправить код, чтобы заголовки не зависели друг от друга.
Показать ещё 6 комментариев
Теги:
header-files

1 ответ

1
Лучший ответ

Избегайте циклического включения с помощью форвардного объявления: используйте указатель window в своем классе MenuItem вместо объекта.

Заменить:

#include "window.h"
class MenuItem {
    bool selected = false;
    window containerWindow;
    etc

От:

class window; // or struct window if window is a struct
class MenuItem {
    bool selected = false;
    window* containerWindow;
    etc

Кроме того, как прокомментировано, убедитесь, что #ifdef имеет #endif, но я не думаю, что это вызывало проблему, о которой вы сообщали.

  • 0
    Большое спасибо! Это заставило его работать! Я пытался использовать предварительное объявление, но это не сработало, хотя я не использовал указатель. Я предполагаю, что это работает, потому что вам не нужно знать, что конструктор по умолчанию при инициализации указателя, правильно?
  • 0
    Он работает с указателями, потому что компилятору не нужно знать фактический размер объекта (компилятор знает размер указателя, это зависит от вашей целевой платформы, но не знает размер объекта Window ... если только заголовочный файл не является входит в комплект).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню