我是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;
};
可能與靜態初始化順序的悲劇。取決於什麼是SFML庫要求。如果它在內部使用靜態,那麼這種靜態的方法將是一個非常糟糕的主意。 – paddy
爲什麼所有的功能都是靜態的?通過使它們成爲靜態的,你不需要創建一個Game類的實例來調用函數,例如,你應該如何調用Game :: IsExistiting(); – Krypton
我的猜測是OP已經知道Java。 – paddy