2012-08-24 19 views
7

Ich habe keine Ahnung, warum dieser Code nicht funktioniert. Alle Quelldateien kompilieren, aber wenn ich versuche, sie zu verknüpfen, schreit der Compiler mich mit einem undefinierten Referenzfehler an. Hier ist der Code:C++ undefinierter Verweis auf statische Variable

main.cpp:

#include "SDL/SDL.h" 
#include "Initilize.cpp" 

int main(int argc, char* args[]) 
{ 
    //Keeps the program looping 
    bool quit = false; 
    SDL_Event exit; 
    //Initilizes, checks for errors 
    if(Initilize::Start() == -1) 
    { 
     SDL_Quit(); 
    } 
    //main program loop 
    while(quit == false) 
    { 
     //checks for events 
     while(SDL_PollEvent(&exit)) 
     { 
      //checks for type of event; 
      switch(exit.type) 
      { 
       case SDL_QUIT: 
       quit = true; 
       break; 
      } 
     } 
    } 
    return 0; 
} 

Initilize.h:

#ifndef INITILIZE_H 
#define INITILIZE_H 
#include "SDL/SDL.h" 

/* Declares surface screen, its attributes, and Start(); */ 
class Initilize { 
protected: 
    static SDL_Surface* screen; 
private: 
    static int SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP; 
public: 
    static int Start(); 
}; 

#endif 

Initilize.cpp:

#include "Initilize.h" 
#include "SDL/SDL.h" 

/* Initilizes SDL subsystems, sets the screen, and checks for errors */ 
int Initilize::Start() 
{ 
    //screen attributes 
    SCREEN_WIDTH = 640; 
    SCREEN_HEIGHT = 480; 
    //Bits per pixel 
    SCREEN_BPP = 32; 
    //Inits all subsystems, if there's an error, return 1 
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1) { 
      return 1; 
    } 
    //sets screen 
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE); 
    //Returns 1 if there was in error with setting the screen 
    if(screen == NULL) { 
      return 1; 
    } 
    SDL_WM_SetCaption("Game", NULL); 
    return 0; 
} 

Sorry, wenn der Code wurde weirdly formatiert, Einfügen vier Leerzeichen, um einen Code-Block einzubauen, hat Dinge ein wenig durcheinandergebracht.

+3

Bitte geben Sie die genaue Fehlermeldung an. – Chip

Antwort

1

Es scheint, dass Sie Ihre Variablen nie initialisiert haben. Sie ordnen sie in der Startmethode Initialize zu, initialisierten sie jedoch nicht. Versuchen Sie, in einem int SCREENWIDTH;, bevor Sie es in der Quelle zuweisen nicht nur Datei-Header

+0

Das behebt den undefinierten Fehler, aber jetzt heißt es, es gibt mehrere Definitionen von Initiize :: Start() ... – user1602079

+0

Sorry Sie brauchen nicht das statische Schlüsselwort, wenn Sie es initialisieren, nur 'int SCREENWIDTH' – user1593858

15

Fügen Sie Folgendes in Ihre CPP-Datei:

SDL_Surface* Initilize::screen = 0; // or nullptr 
int Initilize::SCREEN_WIDTH = 640; 
int Initilize::SCREEN_HEIGHT = 480; 
int Initilize::SCREEN_BPP = 32; 

Auch, wenn dieser Wert nie ändern, wäre es gut, sich zu machen const. Der Grund, warum Sie das oben genannte zu Ihrer cpp-Datei hinzufügen müssen, liegt darin, dass statische Membervariablen außerhalb der Klasse definiert werden müssen. static SDL_Surface* screen; usw. innerhalb Ihrer Klasse ist nur eine Deklaration, und keine Definition. static Mitglieder gelten als speziell und sind einer globalen Variablen sehr ähnlich.

Der Grund dafür ist, dass statische Elemente für alle Instanzen Ihrer Klasse freigegeben sind. Das bedeutet, dass sie nur einmal definiert werden können und die Definition innerhalb der Klasse mehrere Definitionen verursachen würde. Der C++ - Standard zwingt Sie daher, ihn außerhalb Ihrer Klasse zu definieren (und impliziert, dass Sie die Definition in eine cpp-Datei schreiben)).

+0

Dies behebt den undefinierten Fehler aber Gibt eine andere an Ungültige Verwendung von qualifizierten Namen 'Initialisieren :: " – user1602079

+0

@ user1602079: Ändern Sie' #include "Initialize.cpp" 'zu' #include "Initiize.h" '. –

2

in Initialize.cpp

#include "Initialize.h" 
#include "SDL/SDL.h" 

// this is the new line to insert 
SDL_Surface* Initialize::screen = 0; 
int Initialize::SCREEN_WIDTH=...; // whatever you want to set it to 
int Initialize::SCREEN_HEIGHT=...; // whatever you want to set it to 
int Initialize::SCREEN_BPP=...; // whatever you want to set it to 

tun und entfernen Sie die #include "Initialize.cpp" Linie in main.cpp

#include "Initialize.hpp" 

stattdessen tun, wenn Sie gcc verwenden sind, kompilieren mit

g++ -o <output-file> main.cpp Initialize.cpp <include flags like -I> <lib flags like -L> 
+0

Dies wurde behoben! Vielen Dank! – user1602079

+0

@ user1602079 Wenn diese Antwort Ihr Problem gelöst hat, klicken Sie bitte auf das Häkchen links neben der Antwort, damit andere die richtige Antwort sehen können und die Frage von der unbeantworteten Liste abweicht :) – WendiKidd

Verwandte Themen