En pocas palabras:
Tengo una clase que consta principalmente de miembros públicos estáticos, por lo que puedo agrupar funciones similares que aún deben llamarse desde otras clases / funciones.
De todos modos, he definido dos variables char sin signo 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 ve con calma. ¿Por qué no puedo hacer esto?
Las declaraciones de miembros de datos estáticos en la declaración de clase no son una definición de ellas. Para definirlos, debe hacer esto en el
.CPP
archivo para evitar símbolos duplicados.Los únicos datos que puede declarar y definir son constantes estáticas integrales. (Los valores de
enums
pueden usarse también como valores constantes)Es posible que desee volver a escribir su código como:
Si desea tener la capacidad de modificar sus variables estáticas (en otras palabras, cuando no es apropiado declararlas como constantes), puede separar su código entre
.H
y.CPP
de la siguiente manera:.H:
.CPP:
fuente
Dado que este es el primer hilo SO que parece surgir cuando busco "elementos externos no resueltos con miembros constantes estáticos" en general, dejaré aquí otra pista para resolver un problema con elementos externos no resueltos aquí:
Para mí, lo que olvidé fue marcar la definición de mi clase
__declspec(dllexport)
, y cuando llamé desde otra clase (fuera de los límites de dll de esa clase), por supuesto, recibí el error externo no resuelto.Aún así, es fácil de olvidar cuando está cambiando una clase auxiliar interna a una accesible desde otro lugar, por lo que si está trabajando en un proyecto vinculado dinámicamente, también podría verificar eso.
fuente
en mi caso, declaró una variable estática en el archivo .h, como
y en myClass.cpp, intenté usar este m_nMyVar. Recibió un error de ENLACE como:
error LNK2001: símbolo externo no resuelto "público: clase estática ... El archivo cpp relacionado con el error de enlace se ve así:
Entonces agrego el siguiente código en la parte superior de myClass.cpp
entonces LNK2001 se fue.
fuente
En mi caso, estaba usando enlaces incorrectos.
Se gestionó c ++ (cli) pero con exportación nativa. He agregado al enlazador -> entrada -> recurso de enlace de ensamblaje el dll de la biblioteca desde la cual se exporta la función. Pero la vinculación nativa de C ++ requiere que el archivo .lib "vea" las implementaciones en cpp correctamente, por lo que me ayudó a agregar el archivo .lib al enlazador -> input -> dependencias adicionales.
[Por lo general, el código administrado no usa dll export and import, usa referencias, pero esa era una situación única].
fuente