В настоящее время я пытаюсь разбить большую программу "все в одном файле" на отдельные модули, чтобы упростить работу. Моя проблема в том, что в оригинальной (все в одном файле) версии программы была использована декларация перечисления. Я хочу продолжать использовать это объявление в новой версии программы, которая разделена на несколько классов, но я не уверен, что это лучший способ сделать это.
Самое простое решение, которое приходило на ум, заключалось в том, чтобы поместить блок перечисления в файл заголовка и попытаться использовать его как глобальную переменную (я знаю, что глобальные переменные, как правило, плохие, это подходящее использование?) Однако это вызвало кучу msgstr "ошибка C4430: отсутствует спецификатор типа - int. Примечание: C++ не поддерживает default-int".
Я понимаю, что это похоже на вопросы, которые были заданы раньше. Тем не менее, все ответы, которые я смог найти, слишком технические или не совсем то, что я ищу.
Файл My Global.h и файл, где происходят ошибки, приведены ниже.
#ifndef GLOBAL_H_
#define GLOBAL_H_
#include <SDL.h>
#include "LTexture.h"
#include "LButton.h"
enum LButtonSprite
{
BUTTON_SPRITE_MOUSE_OUT = 0,
BUTTON_SPRITE_MOUSE_OVER_MOTION = 1,
BUTTON_SPRITE_MOUSE_DOWN = 2,
BUTTON_SPRITE_TOTAL = 2
};
.
.
#endif GLOBAL_H_
...
#ifndef LBUTTON_H
#define LBUTTON_H
#include <SDL.h>
#include "Global.h"
class LButton
{
public:
//Initializes internal variables
LButton();
//Sets top left position
void setPosition(int x, int y);
//Handles mouse event
void handleEvent(SDL_Event* e);
//Shows button sprite
void render();
LButtonSprite getCurrSprite();//Problem is here
private:
//Button Position
SDL_Point mPosition;
//Button Sprite
LButtonSprite mCurrentSprite;//And here
};
#endif
Во-первых, что вызывает эту ошибку? Во-вторых, может ли кто-нибудь предложить лучший способ реализовать то, что я пытаюсь сделать?
Мое подозрение в том, что компилятор вводит в заблуждение LButtonSprite для переменной. Это основано на цветовом кодировании, предоставляемом VS (типы возврата являются голубыми, но LButtonSprite светло-голубой). Как видно из LButton.h (см. Ниже) LButtonSprite следует читать как возвращаемый тип, а не как переменную.
Благодарю!
Без ключевого слова "extern" то, что вы опубликовали, отлично.
Чтобы избежать коллизий имен, вы можете поместить перечисление в пространство имен или класс.
Кроме того, если LButton является единственным классом, который использует это перечисление, он также может быть определен в определении класса самого LButton.
Global.h
и LButton.h
каждый #include
LButton.h
другой. Это означает, что компилятор видит класс LButton
прежде чем он сможет увидеть перечисление LButtonSprite
, и почему вы видите сообщение об ошибке. Либо удалите
#include "LButton.h"
от Global.h
или, по крайней мере, поставить его ниже декларации enum
.
Это не имеет никакого смысла. Почему вы объявляете это extern
когда вы его определяете? extern
используется для объявлений, которые определены в другом месте.
LButtonSprite
является типом, а не переменной и не может быть объявленextern
.