[英]C++: circular dependency issue
我在循環依賴方面遇到問題,我認為這是錯誤地引入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;
(我猜這打破了循環依賴?)上面的大部分內容都已解決,但每次我嘗試訪問a時, TitleScreen.cpp 都會拋出一組C2027 , C2227和C2228 ( 未定義的類型 ,-的左側和-的 左側)。游戲對象。 IntelliSense指出不允許使用指向不完整類的指針 。
在介紹Game類之前,我已經開始使用它DrawScreen()
和Update()
將以指向窗口的指針( sf::RenderWindow* window
)作為參數。 main.cpp中保留了部分舊代碼。
在GameScreen.h
您應該聲明Game
類而不是包括其整個頭文件,因此:
class Game;
代替:
#include "Game.h"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.