2016-10-11 91 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