Muito simplesmente:
Eu tenho uma classe que consiste principalmente de membros públicos estáticos, para que eu possa agrupar funções semelhantes que ainda precisam ser chamadas de outras classes / funções.
De qualquer forma, eu defini duas variáveis estáticas de caracteres não assinadas no escopo público da classe. Quando tento modificar esses valores no construtor da mesma classe, 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 em C ++, então vá com calma comigo. Por que não posso fazer isso?
Declarações de membros de dados estáticos na declaração de classe não são uma definição deles. Para defini-los, você deve fazer isso no
.CPP
arquivo para evitar símbolos duplicados.Os únicos dados que você pode declarar e definir são constantes estáticas integrais. (Os valores de
enums
podem ser usados também como valores constantes)Você pode reescrever seu código como:
Se você deseja modificar suas variáveis estáticas (em outras palavras, quando é inapropriado declará-las como const), você pode separar seu código entre
.H
e.CPP
da seguinte maneira:.H:
.CPP:
fonte
Como esse é o primeiro thread SO que pareceu surgir para mim ao procurar por "externos não resolvidos com membros const estáticos" em geral, deixarei outra dica para resolver um problema com externos não resolvidos aqui:
Para mim, o que esqueci foi marcar minha definição de classe
__declspec(dllexport)
e, quando chamado de outra classe (fora dos limites da DLL da classe), é claro que recebi o meu erro externo não resolvido.Ainda assim, é fácil esquecer quando você está mudando uma classe auxiliar interna para uma classe acessível de outro lugar; portanto, se você estiver trabalhando em um projeto vinculado dinamicamente, também poderá verificar isso.
fonte
no meu caso, declarei uma variável estática no arquivo .h, como
e no myClass.cpp, tentei usar esse m_nMyVar. Obteve erro de LINK como:
erro LNK2001: símbolo externo não resolvido "public: static class ... O arquivo cpp relacionado ao erro de link é semelhante a:
Então, adiciono o código abaixo na parte superior do myClass.cpp
então o LNK2001 se foi.
fonte
No meu caso, eu estava usando um link errado.
Foi gerenciado c ++ (cli), mas com exportação nativa. Eu adicionei ao vinculador -> entrada -> recurso de link de montagem a dll da biblioteca da qual a função é exportada. Mas a vinculação nativa em c ++ requer que o arquivo .lib "veja" as implementações no cpp corretamente, então, para mim, ajudei a adicionar o arquivo .lib ao vinculador -> entrada -> dependências adicionais.
[Normalmente, o código gerenciado não usa exportação e importação de DLL, ele usa referências, mas essa era uma situação única.]
fonte