2016-10-11 90 views
0

我是C++的新手,對於部分內存管理我有困難,特別是在內存管理方面。這是我的第一個項目,SFML lib遊戲之一。所以我得到一個訪問衝突錯誤,在此代碼: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; 

錯誤發生,當代碼獲取到代碼的最後一行,則_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是遊戲類的私有成員,所以這可能是你的訪問錯誤的原因。

要麼你需要爲Game類創建一個靜態構造方法,並將代碼行放在那裏,或者,也許你根本不需要最後兩行。我不知道sf:RenderWindow類是如何定義的,但也許那個私有聲明就是所需要的。

你演示也許應該有一個線某處說

Game::Start(); 
+0

Game :: Start()在main.cpp中,而且這非常簡單,只有那一行代碼。我試過構造函數,但這會導致鏈接器錯誤LNK2001出現在這些行中。 Msdn澄清,當鏈接程序無法在庫和對象文件中找到引用時,會發生此錯誤。這很奇怪,因爲我也嘗試過更簡單的構造,把所有東西都混合到沒有類結構或任何東西的main.cpp中,並且它工作正常。 – Gwiny