Рефакторинг перечислимого блока c ++

0

В настоящее время я пытаюсь разбить большую программу "все в одном файле" на отдельные модули, чтобы упростить работу. Моя проблема в том, что в оригинальной (все в одном файле) версии программы была использована декларация перечисления. Я хочу продолжать использовать это объявление в новой версии программы, которая разделена на несколько классов, но я не уверен, что это лучший способ сделать это.

Самое простое решение, которое приходило на ум, заключалось в том, чтобы поместить блок перечисления в файл заголовка и попытаться использовать его как глобальную переменную (я знаю, что глобальные переменные, как правило, плохие, это подходящее использование?) Однако это вызвало кучу 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 следует читать как возвращаемый тип, а не как переменную.

Благодарю!

  • 1
    LButtonSprite является типом, а не переменной и не может быть объявлен extern .
Теги:
enums
refactoring
global

3 ответа

1

Без ключевого слова "extern" то, что вы опубликовали, отлично.

Чтобы избежать коллизий имен, вы можете поместить перечисление в пространство имен или класс.

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

0

Global.h и LButton.h каждый #include LButton.h другой. Это означает, что компилятор видит класс LButton прежде чем он сможет увидеть перечисление LButtonSprite, и почему вы видите сообщение об ошибке. Либо удалите

#include "LButton.h"

от Global.h или, по крайней мере, поставить его ниже декларации enum.

0

Это не имеет никакого смысла. Почему вы объявляете это extern когда вы его определяете? extern используется для объявлений, которые определены в другом месте.

Ещё вопросы

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