es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Quiero probar un caso de un singleton simple y está arrojando un error de enlace.

Quiero probar un caso simple de singleton, escriba una clase C a continuación:

class C {
    static C* ptr_c;
    C(){}
public:
    static C* getInstance()
    {
        if (ptr_c == nullptr)
            ptr_c = new C();
        return ptr_c;
    }
    void show()
    {
        std::cout << "esta es la clase C" << std::endl;
    }
};

con código de prueba:

int main()
{
    C* ptrc = C::getInstance();
    ptrc->show();
}

pero muestra un error de enlace:

“Undefined symbols for architecture arm64:
“C::ptr_c”, referenced from:
C::getInstance() in test-1db68d.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)”

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que hay un símbolo no definido para la arquitectura arm64 relacionado con la variable estática ptr_c en la clase C. Esto significa que el enlazador no puede encontrar la definición para esta variable.

    Para solucionar este error, necesitamos agregar una definición de miembro de datos estático para ptr_c fuera de la clase C, de esta manera:

    class C {
        static C * ptr_c;
        C(){}
    public:
        static C* getInstance()
        {
            if (ptr_c == nullptr)
                ptr_c = new C();
            return ptr_c;
        }
        void show()
        {
            std::cout << "esto es la clase C" << std::endl;
        }
    };
    
    C* C::ptr_c = nullptr;   // Definición de miembro de datos estático
    
    int main()
    {
        C* ptrc = C::getInstance();
        ptrc->show();
        return 0;
    }
    

    Esto definirá ptr_c y permitirá que el enlazador enlace correctamente el programa. El código de prueba ahora se puede ejecutar sin ningún problema.

Comments are closed.