2016-10-11 2 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하고 아마 액세스 오류의 원인 있도록 게임 클래스의 private 멤버는 _mainWindow 있습니다.

Game 클래스에 대한 정적 생성자 메서드를 만들고 거기에 문제 코드 줄을 배치하거나 아니면 마지막 두 줄이 필요하지 않을 수도 있습니다. sf : RenderWindow 클래스가 어떻게 정의되는지는 모르겠지만, 아마도 private 선언이 모두 필요합니다.

귀하의 데모는 아마 어딘가에

Game::Start(); 
+0

Game :: Start()는 main.cpp에 있으며 코드의 유일한 줄이 꽤 뭉개져 있습니다. 생성자를 시도했지만 링커 오류 LNK2001이이 줄에 표시됩니다. Msdn은 링커가 라이브러리 및 개체 파일에서 참조를 찾을 수 없을 때이 오류가 발생 함을 분명히합니다. 클래스 구조 나 아무것도없이 main.cpp에 모든 것을 매쉬링하는 훨씬 간단한 구조를 시도했기 때문에 이상합니다. – Gwiny

관련 문제