0

所以我正在制作一个尝试使用 OOP 的游戏,但 Visual Studio 并不高兴我使用 VC++ 2010 express 作为我的 IDE,我决定将 SDL“对象化”为可重用组件,但现在我从 0 个错误变为 122 个错误,其中一些真的不是错误,比如当它说窗口未定义并且我点击转到错误时错误消失了......所以我遇到了一些麻烦

#ifndef GUARD_WINDOWSTATE_H
#define GUARD_WINDOWSTATE_H

#include<SDL.h>
#include"Window.h"
#include"Graphics.h"

/* 
WindowSate is a component to a window class, a windowstate is a seperate
frame of a window, it could be a menu or a level or something
a windowstate handles its events through a window and draws via graphics buffer to
the window's surface it will hold the components of the window(graphics, GUI     components, etc.)
and the window will hold it
*/

class WindowState {
public:

WindowState(Window* window) 
    :m_window(window)
{
    m_window->add_state(this);
}

virtual void load() = 0;

virtual void update( SDL_Event* e) = 0;
virtual void logic() = 0;
virtual void render(Graphics g) = 0;

virtual void unload() = 0;

protected:

Window* m_window;

};

#endif

它告诉我窗口在 window.h 中定义时是未定义的,这里包含的是 window.h:

#ifndef GUARD_WINDOW_H
#define GUARD_WINDOW_H

#include"SDL.h"
#include<vector>
#include<string>
#include"WindowState.h"
#include"Graphics.h"
/*The window class is the interface to the user,
it displays everything and is the top layer of the interactive application
it recieves events and passes them down the chain to states and components
it holds states and enumerates through them
*/

class Window {
private:

//width and height of the window
int m_width, m_height;

//graphics handler of the window
Graphics m_g;

//window surface
SDL_Surface* m_surface;

//event to hold all events
SDL_Event m_events;

//current and qeued states
int m_current_state;
int m_queued_state;

//Current WindowState
WindowState* m_window_state;

//is the window open?
bool m_running;

//title of the window
std::string m_title;

//vector to hold all the window states
std::vector<WindowState*> m_states;

public:
//Basic constructor
Window(int width, int height);
//constructor with title
Window(int width, int height, std::string title);

//returns the windows events
virtual SDL_Event& get_events() { return m_events; }

SDL_Surface* surface() { return m_surface; }

bool is_running() { return m_running; }

virtual void run(); //starts the window

virtual void update();    //updates the events 

virtual void update_state();    //checks for a change in state

virtual void draw();    //draws current state

virtual void close(); // closes the window

void queue_window_state(int state);    //sets up a window state to be activated

void add_state(WindowState* state);    //adds a state to the window

void set_caption(std::string caption);
//destructor
~Window();
};

#endif
4

2 回答 2

2

你有一个循环包含。注意如何WindowState.h包含Window.hWindow.h包含WindowState.h?这是编译器不喜欢的永无止境的依赖循环。

如果是我的钱,我会删除#include <Window.h表格WindowState.h并在上课之前在某处做所谓的前向声明:class Window;.

请记住,您不能在此文件中使用此类。但是,您可以包含它并在相应的WindowState.cpp文件中使用它。

于 2013-06-14T20:03:25.550 回答
0

WindowsState.h这两者WindowGraphics都不需要完整的定义,只是一个前向声明,所以改:

#include"Window.h"
#include"Graphics.h"

到:

class Window;
class Graphics;

Window.hWindowState只需要一个前向声明,所以改变:

#include "WindowsState.h"

到:

class WindowState;

Graphics不能向前声明,Window.h因为必须计算类型的完整大小才能Window成功编译。

使用前向声明可以最大程度地减少文件之间的编译依赖性,并使您的代码编译得更快。例如,更改Graphics.hWindow.h文件将不需要重新编译仅包含 的所有文件WindowState.h

于 2013-06-14T20:27:34.310 回答