У меня проблема с циклическими зависимостями, я полагаю, что это недостаток дизайна из-за неправильного представления класса 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 не дает мне никаких синтаксических ошибок.
Если я удалю #include
заявление от GameScreen.h и заменить его предварительным объявлением class Game;
(который, я думаю, нарушает круговую зависимость?), большинство из вышеперечисленных проблем решено, но TitleScreen.cpp бросает набор C2027, C2227 а также C2228 (неопределенный тип, слева от -> а также слева от .) каждый раз, когда я пытаюсь получить доступ к объекту Game. IntelliSense указывает, что указатель на неполный класс не допускается.
Я начал работать, прежде чем вводить класс Game — DrawScreen()
а также Update()
будет принимать в качестве аргумента указатель на окно (sf::RenderWindow* window
). В main.cpp осталась часть старого кода.
в GameScreen.h
Вы должны объявить Game
класс вместо включения всего заголовочного файла, так что это:
class Game;
вместо:
#include "Game.h"
Других решений пока нет …