我遇到循环依赖的问题,我认为这是以错误的方式引入Game类的设计缺陷。
Game.h:
#pragma once
#include <SFML\Graphics.hpp>
#include "GameScreen.h"
#include "TitleScreen.h"
class Game
{
protected:
sf::RenderWindow window;
GameScreen* CurrentGameScreen;
TitleScreen Title;
public:
Game(void);
~Game(void);
sf::RenderWindow getWindow(void);
void Run();
void Close();
};
GameScreen.h:
#pragma once
#include "Game.h"
class GameScreen
{
public:
GameScreen(void);
~GameScreen(void);
virtual void LoadAllResources() {};
virtual void DrawScreen(Game* game) {};
virtual void Update(Game* game) {};
};
TitleScreen.h:
#pragma once
#include <SFML\Graphics.hpp>
#include "GameScreen.h"
class TitleScreen : public virtual GameScreen
{
private:
sf::Texture title_screen;
sf::Sprite titleScreen;
sf::Font font;
sf::Text menuExit;
public:
TitleScreen(void);
~TitleScreen(void);
void LoadAllResources();
void DrawScreen(Game* game);
void Update(Game* game);
};
然后是主文件:
#include "Game.h"
int main()
{
Game game;
game.Run();
//sf::RenderWindow window(sf::VideoMode(800, 600), "Test");
//GameScreen* currentScreen;
//TitleScreen titleScreen;
//currentScreen = &titleScreen;
//while (window.isOpen())
//{
// currentScreen->Update(&window);
// currentScreen->DrawScreen(&window);
//}
return 0;
}
GameScreen.h 和 TitleScreen.h 提出了一些 C2061 。据我所知,这些是由Game.h和Gamescreen.h之间的循环依赖引起的。
TitleScreen.h 给我错误C2504:'GameScreen':基类未定义。
Game.h :在第12行和第13行,给出 C2143:语法错误:缺少';'在'*'之前,虽然我不确定它的来源,但我的IDE没有给我任何语法错误。
如果我从GameScreen.h中删除#include
语句并用前向声明class Game;
替换它(我想打破循环依赖?),上面的大部分内容都已解决,但 TitleScreen.cpp 会抛出一组 C2027 , C2227 和 C2228 (未定义类型,左边的 - &gt; 和左边。。 IntelliSense指出不允许指向不完整类的指针。
我在介绍Game类之前让它工作 - DrawScreen()
和Update()
将参数作为指向窗口(sf::RenderWindow* window
)的指针。 main.cpp中有部分旧代码。
答案 0 :(得分:4)
在GameScreen.h
中,您应该声明Game
类而不是包含其整个头文件,所以这个:
class Game;
而不是:
#include "Game.h"