Pregunta

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 estáticas sin signo en el ámbito público de mi clase, cuando trato de modificar estos valores en el constructor de la misma clase, obtengo un " símbolo externo no resuelto " error 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?

¿Fue útil?

Solución

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

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

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

unsigned char test::X = 4;

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

Otros consejos

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 archivo .CPP para evitar símbolos duplicados.

Los únicos datos que puede declarar y definir son constantes estáticas integrales. (Los valores de enums también 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 no es apropiado declararlas como constantes), 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.
}

Dado que este es el primer hilo SO que pareció surgir cuando busqué '' externos no resueltos con miembros const estáticos ''; en general, dejaré 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, obtuve mi sin resolver error externo.
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 también.

en mi caso, declaró una variable estática en el archivo .h, como

//myClass.h
class myClass
{
static int m_nMyVar;
static void myFunc();
}

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í:

//myClass.cpp
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}

Entonces agrego el siguiente código en la parte superior de myClass.cpp

//myClass.cpp
int myClass::m_nMyVar; //it seems redefine m_nMyVar, but it works well
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}

entonces LNK2001 se ha ido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top