2012-08-24 26 views
7

No tengo idea de por qué este código no funciona. Todos los archivos fuente se compilan, pero cuando intento vincularlos, el compilador me grita con un error de referencia no definido. Aquí está el código:C++ Referencia indefinida a la variable estática

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; 
} 

Lo siento si el código se ha formateado extrañamente, insertando cuatro espacios para poner en un bloque de código estropearon un poco las cosas.

+3

Por favor ingrese el mensaje de error exacto. – Chip

Respuesta

1

Parece que nunca ha inicializado sus elementos básicos. Los está asignando en el método de inicio Inicializar pero no los inicializó. Trate de añadir en un int SCREENWIDTH; antes de asignarlo en la fuente no sólo de encabezado de archivo

+0

Eso corrigió el error indefinido, pero ahora dice que hay múltiples definiciones de Initilize :: Start() ... – user1602079

+0

Lo sentimos, no necesitas la palabra clave estática cuando la estás inicializando simplemente 'int SCREENWIDTH' – user1593858

15

Añadir lo siguiente a su archivo CPP:

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

Además, si estos valores no cambian nunca, que sería bueno para hacerlos const. La razón por la que necesita agregar lo anterior a su archivo cpp es porque las variables estáticas miembro deben definirse fuera de la clase. static SDL_Surface* screen;, etc. dentro de su clase es solo una declaración, y no una definición. static miembros se consideran especiales y es muy similar a una variable global.

El motivo es que los miembros estáticos se comparten entre todas las instancias de su clase. Esto significa que solo se pueden definir una vez y permitir la definición dentro de la clase provocaría que se produzcan múltiples definiciones, por lo que el estándar C++ obliga a definirlo fuera de su clase (y también implica que debe poner la definición en un archivo cpp)

+0

Esto corrige los errores de error no definidos da otro que dice Uso inválido del nombre calificado 'Initilize :: " – user1602079

+0

@ user1602079: Cambia' #include "Initilize.cpp" 'a' #include "Initilize.h" ' –

2

en Initialize.cpp hacer

#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 

y eliminar la línea #include "Initialize.cpp" en main.cpp

lugar hacer

#include "Initialize.hpp" 

si está utilizando gcc, compilar usando

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

¡Esto lo arregló! ¡Gracias! – user1602079

+0

@ user1602079 Si esta respuesta resolvió su problema, haga clic en la marca de verificación a la izquierda de la respuesta para que otros puedan ver la respuesta correcta y la pregunta salga de la lista sin respuesta :) – WendiKidd