У меня проблема с круговыми зависимостями, я полагаю, что это ошибка дизайна от введения класса 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.
Как ответил @piokuc, вам нужно [Вперед объявление] (http://en.wikipedia.org/wiki/Forward_declaration) – Olwaro