C ++:循环依赖问题

时间:2013-05-07 13:24:11

标签: c++ circular-dependency

我遇到循环依赖的问题,我认为这是以错误的方式引入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中有部分旧代码。

1 个答案:

答案 0 :(得分:4)

GameScreen.h中,您应该声明Game类而不是包含其整个头文件,所以这个:

class Game;

而不是:

#include "Game.h"