Класс C ++ читается как переменная, тип по умолчанию int? Чего-чего? - PullRequest
0 голосов
/ 11 июля 2009

Итак, у меня есть два класса ... Очень базовые по структуре. Я пытаюсь импортировать один в другой и объявлять новый объект этого типа класса ... однако, кажется, что имя класса читается как имя переменной?!

Класс заголовка, представленный ниже, не будет правильно читать класс ApplicationManager. Код:

####ifndef _GAME_H_  
####define _GAME_H_  
####include "application.h"  
####include "applicationmanager.h"  
class Game : public Application  
{  
public:  
    Game();  
    ~Game();  
    void LoadContent() override;  
    void UnloadContent() override;  
    void Draw() override;  
private:  
    //int ApplicationManager; //WHY DOES THIS COMPILE??!  
    ApplicationManager management; //This DOES NOT WORK?  
};  
####endif  

Вот заголовок для класса «ApplicationManager». Код:

####ifndef _APPMANAGER_H_  
####define _APPMANAGER_H_  
####include "game.h"  
####include "application.h"  
class ApplicationManager  
{  
public:  
    ApplicationManager(void);  
    ~ApplicationManager(void);  
private:  
};  
####endif  

Ошибка, которая возникает, говорит мне, что мне нужно ";" до «управления», и что в «ApplicationManager» отсутствует спецификатор типа, поэтому предполагается, что это тип по умолчанию int.

... есть идеи, почему он не будет правильно компилироваться? Может кто-нибудь еще попробовать и сообщить о результатах? Я скопировал код и вставил его в другое решение, чтобы посмотреть, не испортилось ли что-то .... это все равно не сработало.

Ответы [ 3 ]

8 голосов
/ 11 июля 2009

У вас есть циклическая ссылка. Когда game.h включено из applicationmanager.h, класс ApplicationManager еще не прочитан компилятором.

Чтобы исправить, удалите строку

#include "game.h"

из applicationmanager.h.

2 голосов
/ 11 июля 2009

Почему у вас круговая зависимость между Game.h и AppicationManager.h?

Кроме того, я бы сказал, проверьте вашу защиту заголовка (#ifdef _*_H) в Application.h. Довольно часто в C ++ при копировании / вставке кода или копировании файлов забывают изменить имя определения защитного заголовка для нового класса, так что в итоге вы получите два разных заголовка, защищенных одним и тем же определением. В этом случае, если оба они включены в какой-то другой файл, только первый будет фактически превращен во что-нибудь полезное.

1 голос
/ 11 июля 2009

Сообщение об ошибке кое-что вводит в заблуждение. В основном это говорит: «По какой-то причине (возможно, ошибка в ссылочном типе) я не могу распознать тип, который вы используете (в вашем случае ApplicationManager)». Если вам нужно, чтобы ApplicationManager знал об Game, создайте чистый виртуальный базовый класс (интерфейс в других терминах) и сделайте так, чтобы Game унаследовал его (без расширения интерфейса), и чтобы ApplicationManager включил заголовочный файл базового класса

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