C ++: проблема циклических зависимостей

У меня проблема с циклическими зависимостями, я полагаю, что это недостаток дизайна из-за неправильного представления класса 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 осталась часть старого кода.

0

Решение

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

class Game;

вместо:

#include "Game.h"
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector