0

循環依存関係に問題があります。これは、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.hTitleScreen.hは、一握りのC2061を発生させます。私が理解していることから、これらは Game.h と Gamescreen.h の間の循環依存関係によって引き起こされます。

TitleScreen.hエラー C2504: 'GameScreen' : base class undefined が表示されます。

Game.h : 12 行目と 13 行目で、C2143: syntax error : missing ';'を指定します。'*' の前ですが、これがどこから来ているのかわからず、IDE で構文エラーが発生していません。

#includeGameScreen.h からステートメントを削除し、前方宣言に置き換えるとclass Game;(循環依存関係が壊れると思いますか?)、上記のほとんどは解決されますが、TitleScreen.cppはC2027C2227、およびC2228のセットをスローします( undefined type->左と . の左) Game オブジェクトにアクセスしようとするたびに。IntelliSenseは、不完全なクラスへのポインタは許可されていないことを指摘しています。

Game クラスを導入する前に動作するDrawScreen()ようになりました。Update()引数として window ( ) へのポインターを取りますsf::RenderWindow* window。main.cpp には古いコードの一部が残っています。

4

1 に答える 1