2008-10-12 21 views
99

muy sencillamente:símbolo externo sin resolver en miembros de la clase estática

tengo una clase que consiste principalmente de los miembros estáticos públicos, por lo que puede agrupar funciones similares juntos que todavía tienen que ser llamado desde otras clases/funciones.

De todos modos, he definido dos variables de char estáticas sin signo en el ámbito público de mi clase, cuando intento modificar estos valores en el constructor de la misma clase, obtengo un error de "símbolo externo no resuelto" en la compilación.

class test { 

    public: 

     static unsigned char X; 
     static unsigned char Y; 

     ... 

     test(); 
}; 

test::test() { 
    X = 1; 
    Y = 2; 
} 

Soy nuevo en C++ así que no me moleste. ¿Por qué no puedo hacer esto?

Respuesta

112

se le olvidó añadir las definiciones para que coincida con sus declaraciones de X e Y

unsigned char test::X; 
unsigned char test::Y; 

en alguna parte. Es posible que desee también inicializar un miembro estático

unsigned char test::X = 4; 

y otra vez, lo hace en la definición (por lo general en un archivo CXX) no en la declaración (que es a menudo en un archivo .H)

+1

Si está escribiendo biblioteca sólo de encabezado, puede utilizar esta técnica para evitar cpp: http://stackoverflow.com/questions/11709859/how-to-have-static -data-members-in-a-header-only-library – ShitalShah

54

Las declaraciones de miembros de datos estáticos en la declaración de clase no son una definición de ellos. Para definirlos, debe hacer esto en el archivo .CPP para evitar símbolos duplicados.

Los únicos datos que puede declarar y definir son las constantes estáticas integrales. (Valores de enums se pueden utilizar como valores constantes también)

Es posible que desee volver a escribir el código como:

class test { 
public: 
    const static unsigned char X = 1; 
    const static unsigned char Y = 2; 
    ... 
    test(); 
}; 

test::test() { 
} 

Si usted quiere tener la capacidad de modificar que las variables estáticas (es decir, cuando que no procede declarar como const), que se puede separar código entre .H y .CPP de la siguiente manera:

.H:

class test { 
public: 

    static unsigned char X; 
    static unsigned char Y; 

    ... 

    test(); 
}; 

.CPP:

unsigned char test::X = 1; 
unsigned char test::Y = 2; 

test::test() 
{ 
    // constructor is empty. 
    // We don't initialize static data member here, 
    // because static data initialization will happen on every constructor call. 
} 
Cuestiones relacionadas