我遇到了循环依赖问题,我想这是以错误方式引入 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();
};
游戏画面.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) {};
};
标题屏幕.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' : base class undefined。
Game.h:在第 12 和 13 行,给出C2143: syntax error : missing ';' 在 '*' 之前,虽然我不确定这是从哪里来的,而且我的 IDE 没有给我任何语法错误。
如果我#include
从 GameScreen.h 中删除该语句并用前向声明替换它class Game;
(我猜这会破坏循环依赖?)以上大部分问题都已解决,但TitleScreen.cpp抛出一组C2027、C2227和C2228(未定义类型,左侧 ->和左侧 . ) 每次我尝试访问 Game 对象时。IntelliSense 指出不允许使用指向不完整类的指针。
我在介绍 Game 类之前让它工作了 -DrawScreen()
并将Update()
一个指向 window ( sf::RenderWindow* window
) 的指针作为参数。main.cpp 中保留了部分旧代码。