#c
#c
Вопрос:
У меня есть класс состояния, который полностью реализован, как описано ниже. У меня также есть класс PlayState, который наследует класс State, он тоже полностью реализован. Моя ошибка компиляции «playstate.h(6): ошибка C2504: ‘State’: базовый класс не определен» Я проверил их порядок в Global.h, State.h появляется перед PlayState.h
код:
STATE.H
#pragma once
#include "Global.h"
class State
{
public:
State(void);
virtual ~State(void);
virtual void Input(INPUTDATA* InputData);
virtual void Logic(OBJECT go[], INPUTDATA* InputData);
virtual void Render(OBJECT go[]);
virtual void InitGame(OBJECT go[]);
virtual void LoadGraphics(void);
void Toggle();
bool IsEnabled();
private:
bool isEnabled;
};
PlayState.h
#include "Global.h"
class PlayState : public State
{
private:
#define UPDATESPEED 1000 // milliseconds between each update
// global variables
float camXAngle;
float camYAngle;
float camZoom;
int updatetime;
bool gameover;
float runspeed;
D3DLIGHT9 light;
SPRITE graphics;
SPRITE particleTexture;
MODEL terrain[2];
MODEL sky;
public:
PlayState();
~PlayState();
void Input(INPUTDATA* InputData);
void Logic(OBJECT go[], INPUTDATA* InputData);
void Render(OBJECT go[]);
void InitGame(OBJECT go[]);
void LoadGraphics(void);
};
Спасибо
Комментарии:
1. @user692270: Можете ли вы показать, как
Global.h
выглядит ваш?2. Вы имеете в виду, что вы включаете «PlayState.h» в «Global.h» и в то же время включаете «Global.h» в «PlayState.h»?
3. @user692270: Верно. Вы должны показать содержимое «Global.h» и содержимое вашего скомпилированного файла *.cpp.
Ответ №1:
Если какой-либо *.cpp включает «Состояние.h» без «Global.h» где-нибудь перед ним, тогда у вас будет ошибка, которую вы опубликовали.
Потому что, когда «State.h» включает «Global.h», тогда «Global.h» не включает «State.h» (из-за #pragma once
), но включает «PlayState.h», так что в итоге у вас есть «PlayState.h», включенный до того, как class State
определено.
Только не делайте таких странных циклических включений.
Ответ №2:
Если ваш Global.h
уже включает State.h
и PlayState.h
и в том порядке, который State.h
помещен перед PlayState.h
, то нет причин для получения конкретной ошибки (для опубликованного вами исходного кода), если только вы не допустили какую-нибудь глупую опечатку, например, не пропустили заглавные буквы в State. Пожалуйста, проверьте, нет ли опечаток! или может быть другая причина проблемы.
Вы создаете циклическую зависимость включений, чего следует избегать.
Простым решением может быть отказ от включения обоих includes, State.h
и PlayState.h
в Global.h
. Просто включите State.h
внутрь PlayState.h
, и все должно быть в порядке. Global.h
таким образом не будет создаваться никаких циклических зависимостей.
Комментарии:
1. «здесь нет причин для получения ошибки» Неверно. Если какой-либо *.cpp включает «Состояние. h» без «Global.h» где-нибудь перед этим, тогда у вас будет точно такая же ошибка, что и у poster.
2. @Serge Dundich: Верно, я должен сказать, что в исходном коде, опубликованном OP. Я внесу это изменение, хотя отредактированное предложение может решить его проблему.
3. ДА. Циклические включения — это зло, которого следует избегать.
Ответ №3:
#pragma once
#include "Global.h"
class PlayState : public State
Что такое «Состояние»? Именно на это жалуется компилятор.
Вы не можете наследовать от класса, который не был полностью определен. Просматривая файл PlayState.h, вы нигде не указываете класс состояния.
ИСПРАВЛЕННЫЙ КОД:
#pragma once
#include "State.h"
class PlayState : public State
Комментарии:
1. Хотя это и не включено в исходный код вопросов, пользователь692270, похоже, указал, что в ‘global.h’ он включал оба State.h и PlayState.h в правильном порядке. Почему это имеет какое-либо значение, если оно снова включено в PlayState.h? Влияет ли на это pragma один раз?
2. ваш исправленный код ничего не исправляет в этой ситуации. У вас все равно будет та же ошибка.