2013-05-07 2 views
0

У меня проблема с круговыми зависимостями, я полагаю, что это ошибка дизайна от введения класса Game в неправильном направлении.C++: проблема с круговой зависимостью

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 не дает мне никаких синтаксических ошибок.

Если удалить #include заявление от GameScreen.h и заменить его вперед декларации class Game; (который я предполагаю, что перерывы круговую зависимость?), Большинство из вышеперечисленного решается, но TitleScreen.cpp бросает набор C2027, C2227 и C2228 (неопределенный тип, слева от -.> и слева от) каждый раз, когда я пытаюсь получить доступ к объекту игры. IntelliSense указывает, что указатель недопустимого класса не разрешен.

Я получил его, прежде чем вводить класс игры - DrawScreen() и Update() будет принимать в качестве аргумента указатель на окно (sf::RenderWindow* window). Часть старого кода оставлена ​​в main.cpp.

+1

Как ответил @piokuc, вам нужно [Вперед объявление] (http://en.wikipedia.org/wiki/Forward_declaration) – Olwaro

ответ

4

В GameScreen.h вы должны объявить Game класс вместо включения весь свой файл заголовка, так это:

class Game; 

вместо:

#include "Game.h" 
Смежные вопросы