"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que estou recebendo o erro "Símbolo externo não resolvido" ao definir um campo estático em C++?

Por que estou recebendo o erro "Símbolo externo não resolvido" ao definir um campo estático em C++?

Publicado em 2024-11-09
Navegar:905

Why Am I Getting \

Símbolo externo não resolvido para campo de objeto estático

Este artigo investiga a mensagem de erro "erro LNK2001: símbolo externo não resolvido" encontrada ao tentar definir um campo estático em uma classe do método principal.

No trecho de código fornecido, a declaração do campo estático "a" na classe "B" ocorre dentro da própria definição da classe. Porém, de acordo com o padrão C, tais declarações não são consideradas definições. Para membros de dados estáticos, a definição adequada deve aparecer fora da classe no escopo do namespace envolvente, usando o operador "::".

A regra que rege esse requisito é conhecida como One Definition Rule (ODR), que determina que cada entidade (incluindo membros de dados estáticos) tenha uma definição única e exclusiva em todo o programa. Esta regra garante que não haja ambigüidade em relação ao valor do membro estático.

Portanto, para resolver o erro, o código deve ser modificado da seguinte forma, onde "a" é definido no escopo do namespace:

class A
{
public:
    A()
    {

    }
};

class B
{
public:
    static A* a;
};

A* B::a; // Definition in namespace scope

int main()
{
    B::a = new A;
}

Ao definir explicitamente o membro estático fora da classe, o vinculador pode resolver corretamente a referência do símbolo e o código será compilado com sucesso.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3