Pergunta

Muito simplesmente colocar:

Eu tenho uma classe que consiste principalmente de membros públicos estático, para que eu possa agrupar funções semelhantes juntos, que ainda tem que ser chamado a partir de outras classes / funções.

De qualquer forma, tenho definido duas variáveis ??unsigned char estáticos no meu âmbito público classe, quando eu tentar modificar estes valores na mesma classe construtor, eu estou recebendo um erro 'símbolo externo não resolvido' na compilação.

class test 
{
public:
    static unsigned char X;
    static unsigned char Y;

    ...

    test();
};

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

Eu sou novo para C ++ para ir fácil em mim. Por que eu não posso fazer isso?

Foi útil?

Solução

Você esqueceu de adicionar as definições para corresponder às suas declarações de X e Y

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

em algum lugar. Você pode querer também inicializar um membro estático

unsigned char test::X = 4;

e, novamente, você fazer isso na definição (geralmente em um arquivo CXX) não na declaração (que é muitas vezes em um arquivo .H)

Outras dicas

estáticos membros de dados declarações na declaração de classe não são definição deles. Para defini-los você deve fazer isso no arquivo .CPP para evitar símbolos duplicados.

Os únicos dados que você pode declarar e definir é constantes estáticas integrais. (Os valores de enums podem ser utilizados como valores constantes como bem)

Você pode querer reescrever seu código como:

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

test::test() {
}

Se você quer ter a capacidade de modificar você variáveis ??estáticas (em outras palavras, quando não é apropriado para declará-los como const), você pode separá-lo de código entre .H e .CPP da seguinte maneira:

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

Uma vez que este é o primeiro segmento SO que parecia vir para mim quando procurar "externos não resolvidos com membros static const" Em geral, eu vou deixar outra dica para resolver um problema com externos não resolvidos aqui:

Para mim, a coisa que eu esqueci era marcar o meu __declspec(dllexport) definição de classe, e quando chamado a partir de uma outra classe (fora que os limites de dll de classe), eu, naturalmente, tenho o meu erro externo não resolvido.
Ainda assim, fácil esquecer quando você está alterando uma classe auxiliar interna para um acessível a partir de outros lugares, por isso, se você está trabalhando em um projeto ligado dinamicamente, assim como você pode verificar isso também.

No meu caso, eu declarei uma variável estática em .h arquivo, como

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

e em MyClass.cpp, tentei usar este m_nMyVar. Ele obteve o erro link como:

LNK2001 de erro: Símbolo externo não resolvido "pública: classe estática ... Os relacionado erro de link olhares de arquivo CPP como:

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

Então eu adicionar o código abaixo no topo da 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
}

então LNK2001 está desaparecido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top