我是一名新手程序员,仍在尝试学习 C++ 和 OOP 设计基础知识。我一直在自学的项目是一个 C++ 游戏,它有多个类、文件、状态等。然而,我一直遇到文件组织的障碍,从简单地在哪里创建对象到编译 -破坏链接器错误。
这是我遇到的一些错误的示例:
1>SMGA.obj : error LNK2005: "class Engine smgaEngine" (?smgaEngine@@3VEngine@@A) already defined in Engine.obj
1>SplashScreenState.obj : error LNK2005: "class Engine smgaEngine" (?smgaEngine@@3VEngine@@A) already defined in Engine.obj
1>StateManager.obj : error LNK2005: "class StateManager gameStateManager" (?gameStateManager@@3VStateManager@@A) already defined in Engine.obj
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
我在网上环顾四周,发现了很多类似的问题,这些问题涉及错误的包含保护或包含 .cpp 文件而不是 .h 文件。但是我没有在我的代码中这样做,所以我很茫然。
现在,我猜测错误告诉我我正在尝试创建 Engine 类的 smgaEngine 对象(以及 StateManager 类的 gameStateManager 对象),但我不知道为什么......
这两个对象(smgaEngine 和 gameStateManager)的突出之处在于,我在类声明之后立即在其相应的类的 .h 文件中声明了它们。这可能是问题吗?- 它们仍在包含保护中,我不太确定将它们放在我的代码中的其他位置......这种草率的编码会导致链接器错误吗?
这是可疑类之一...
#ifndef ENGINE_H
#define ENGINE_H
#include <SDL.h>
#include "Timer.h"
class Engine
{
private:
static const int screenWidth = 480;
static const int screenHeight = 270;
static const int screenBPP = 24;
bool running;
SDL_Surface *mainScreen;
SDL_Event eventHolder;
Timer fpsTimer;
public:
Engine();
~Engine();
void init();
void handleEvents();
void handleLogic();
void handleRender();
void cleanUp();
SDL_Event *getEvent();
SDL_Surface *getMainScreen();
bool isRunning();
void setRunning(bool tempRunning);
} smgaEngine;
#endif
这是另一个:
#ifndef STATEMANAGER_H
#define STATEMANAGER_H
#include "SplashScreenState.h"
#include <vector>
class GameState;
class StateManager
{
private:
std::vector<GameState*> stateStack;
SplashScreenState *splashState;
public:
StateManager();
~StateManager();
void init();
void changeState( GameState *tempNextState );
void addState( GameState *tempNextState );
void removeState();
//returns the back() element of the stateStack vector..
GameState* getTopState();
void handleEvents();
void handleLogic();
void handleRender();
} gameStateManager;
#endif
我一直在努力学习 C++ 和 OOP,但我真的很挣扎。似乎每次我尝试用封装的类编写干净的代码时,我最终都会陷入混乱。我试图防止高度的类耦合,但我经常会遇到链接器错误或类之间缺乏通信能力......是在头文件中创建类实例对象导致这些错误或者是别的什么?如果这是我的链接器错误的原因,那么我应该在哪里创建这些对象?