2016-10-11 4 views
0

私はC++には新しく、特にメモリ管理では難しい部分があります。これは私の最初のプロジェクト、SFMLのlibゲームの一つです。だから私は、このコードでは、アクセス違反のエラーが表示されます。コードは、コードの最後の行、_mainWIndow宣言になったとき C++アクセス違反の書き込み場所

は「Game.h」

void Game::Start() 
{ 
    if (_gameState == Uninitialized) 
     return; 
    _mainWindow.create(sf::VideoMode(1024, 768, 32), "Hi!"); 
    _gameState = Game::Playing; 

    while (!IsExiting()){ 
     GameLoop(); 
    } 

    _mainWindow.close(); 
} 

bool Game::IsExiting(){ 
    if (_gameState == Game::Exiting) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

void Game::GameLoop(){ 
    sf::Event currentEvent; 
    while (_mainWindow.pollEvent(currentEvent)) 
     { 
      switch (_gameState) 
      { 
      case Game::Playing: 
       { 
        _mainWindow.clear(sf::Color(255, 255, 255)); 
        _mainWindow.display(); 

        if (currentEvent.type == sf::Event::Closed) 
        { 
         _gameState = Game::Exiting; 
        } 
        break; 
       } 
      } 
     } 
} 

Game::GameState Game::_gameState = Uninitialized; 
sf::RenderWindow Game::_mainWindow; 

エラーが発生したが、含まれています。私は、静的な癖を完全には理解していないので、おそらくこの問題が起こっていることを理解しています。しかし、私はまだ、まだ何が問題を引き起こし、どのようにそれを解決するのか理解していません。

ゲームクラス:それはおそらくあなたのアクセスエラーの原因となっているので

class Game 
{ 
public: 
    static void Start(); 
private: 
    static bool IsExiting(); 
    static void GameLoop(); 

    enum GameState {Uninitialized, ShowingSplash, Paused, ShowingMenu, Playing, Exiting}; 

    static GameState _gameState; 
    static sf::RenderWindow _mainWindow; 
}; 
+0

は静的初期化順序フィアスコに関連するかもしれないと言ってラインを持っている必要があります。どのようなSFMLライブラリ要件があるかによって異なります。それが静的なものを内部的に使っているのであれば、静的なこの素朴なアプローチは本当に悪い考えです。 – paddy

+0

なぜすべての機能は静的ですか?それらを静的にすると、Gameクラスのインスタンスを作成して関数を呼び出すことはできません。たとえば、Game :: IsExistiting()を呼び出す方法です。 – Krypton

+0

私の推測では、OPはすでにJavaを知っているということです。 – paddy

答えて

0

_gameStateと_mainWindowは、ゲームのクラスのprivateメンバーです。

Gameクラスの静的コンストラクターメソッドを作成し、そこに問題のコード行を配置するか、まったく最後の2行を必要としないことがあります。私はどのようにsf:RenderWindowクラスが定義されているのかわかりませんが、おそらくそのprivate宣言だけが必要です。

あなたのデモは、おそらくどこか

Game::Start(); 
+0

Game :: Start()はmain.cppにあり、そこにはコードの唯一の行があります。私はコンストラクタを試しましたが、それはリンカエラーLNK2001これらの行に表示されます。 Msdnは、リンカがライブラリおよびオブジェクトファイル内の参照を見つけることができない場合にこのエラーが発生することを明らかにしています。これは奇妙なものです。クラス構造や何もせずにすべてをmain.cppにマッシュアップするより簡単な構造を試してみました。 – Gwiny

関連する問題