2016-10-11 10 views
0

Ich bin neu in C++, und ich habe Schwierigkeiten, einige seiner Teile zu verstehen, vor allem in der Speicherverwaltung. Dies ist eines meiner ersten Projekte, ein SFML-Lib-Spiel. So erhalte ich eine Zugriffsverletzung Fehler, in diesem Code:C++ Zugriffsverletzung Schreibort

umfassen "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; 

Der Fehler tritt auf, wenn der Code auf der allerletzten Zeile Code bekommt, die _mainWIndow Erklärung. Ich verstehe, dass dieses Problem höchstwahrscheinlich passierte, weil ich die Macken der Statik nicht vollständig verstehe. Aber ich verstehe immer noch nicht, was das Problem verursacht und wie man es löst.

The Game Klasse:

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

könnte zum Static Initialisierungsreihenfolge Fiasco bezogen werden. Hängt davon ab, welche SFML-Bibliotheksanforderungen gelten. Wenn es intern mit Statik arbeitet, wäre dieser naive Ansatz mit Statik eine wirklich schlechte Idee. – paddy

+0

Warum sind alle Funktionen statisch? Wenn Sie sie statisch machen, erstellen Sie keine Instanz der Game-Klasse, um die Funktionen aufzurufen. So sollten Sie beispielsweise Game :: IsExistiting(); – Krypton

+0

Meine Vermutung ist, dass das OP bereits Java kennt. – paddy

Antwort

0

_gameState und _mainWindow sind private Mitglieder der Klasse Spiel, so dass wahrscheinlich die Ursache für Ihre Zugriffsfehler ist.

Entweder müssen Sie eine statische Konstruktormethode für die Game-Klasse erstellen und die problematischen Codezeilen dort platzieren, oder vielleicht brauchen Sie gar nicht die letzten zwei Zeilen. Ich weiß nicht, wie die sf: RenderWindow Klasse definiert ist, aber vielleicht ist diese private Deklaration alles was benötigt wird.

Ihre Demo sollte wohl eine Linie irgendwo sagen

Game::Start(); 
+0

Game :: Start() ist in der main.cpp, und das ist ziemlich Brei die einzige Zeile des Codes dort. Ich habe versucht, den Konstruktor, aber das verursacht den Linker-Fehler LNK2001 für diese Zeilen angezeigt. Msdn stellt klar, dass dieser Fehler auftritt, wenn der Linker den Verweis in Bibliotheken und Objektdateien nicht finden kann. Das ist seltsam, weil ich auch die viel einfachere Konstruktion versucht habe, alles einfach in main.cpp ohne Klassenstruktur oder irgendetwas zu mischen, und es hat funktioniert. – Gwiny

Verwandte Themen