must initialize functions c++ class static members

c++ - initialize - Símbolo externo sin resolver en miembros de clase estática



singleton c++ (3)

Muy simple:

Tengo una clase que consiste principalmente en miembros públicos estáticos, por lo que puedo agrupar funciones similares que todavía tienen que ser llamadas desde otras clases / funciones.

De todos modos, he definido dos variables de char no firmadas estáticas 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 molestes. ¿Por qué no puedo hacer esto?


Dado que este es el primer hilo SO que pareció surgir cuando busco "elementos externos no resueltos con miembros estáticos de const" en general, dejaré otra pista para resolver un problema con elementos externos no resueltos aquí:

Para mí, lo que olvidé fue marcar mi definición de clase __declspec(dllexport) , y cuando me llamaron desde otra clase (fuera de los límites de la dll de esa clase), por supuesto obtuve el error externo no resuelto.
Aún así, es fácil olvidarlo cuando se cambia una clase de ayuda interna a una accesible desde cualquier otro lugar, por lo que si está trabajando en un proyecto vinculado dinámicamente, también puede verificarlo.


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. (Los valores de enums se pueden usar como valores constantes)

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

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

Si desea tener la capacidad de modificar sus variables estáticas (en otras palabras, cuando es inapropiado declararlas como const), puede separar su 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. }


Olvidó agregar las definiciones para que coincida con sus declaraciones de X e Y

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

algun lado. Es posible que también desee inicializar un miembro estático

unsigned char test::X = 4;

y nuevamente, lo haces en la definición (generalmente en un archivo CXX) que no está en la declaración (que a menudo está en un archivo .H)