单例中未解决的外部符号

Unresolved external symbol in singleton

本文关键字:符号 外部 未解决 单例中      更新时间:2023-10-16

我有这样的代码:

#pragma once
#include "MV/stateSystem/StateSystem.hpp"
#include "MV/config/Config.hpp"
namespace mv
{
    class Initializator
    {
        /* ===Objects=== */
    public:
    protected:
    private:
        static Initializator *instance;
        /* ===Methods=== */
    public:
        //Inits the program
        void init();
        static Initializator& getInstance();
        static void createInstance();
    protected:
    private:
        Initializator();
        Initializator(Initializator const& copy) = delete;            // Not Implemented
        Initializator& operator=(Initializator const& copy) = delete; // Not Implemented
    };
}
and .cpp
    #include "Initializator.hpp"

    namespace mv
    {
    Initializator* Initializator::instance;
    void Initializator::init()
    {
        StateSystem::readStatesFromFile("data/states/states.txt");
    }
    Initializator & Initializator::getInstance()
    {
        if (instance == 0)
            Logger::Log(constants::error::singleton::SINGLETON_NOT_INITED, Logger::STREAM::BOTH, Logger::TYPE::ERROR);
        return *instance;
    }
    void Initializator::createInstance()
    {
        if (instance == 0)
            instance = new Initializator();
    }
}

但是我的编译器有问题:

严重性代码描述项目文件行抑制状态错误lnk2019未解决的外部符号"私有:__ thiscall mv :: initializator :: initializator(void)"(?? 0Initializator@mv@@@@@@@@@@@@xz@xz))"(?createInstance@initizator@mv @@ saxxz)

我无法理解它,因为我还有其他类型的代码确实相似,而且编译器对此没有问题。过去,当我遇到这个问题时,我不得不在.cpp文件中声明静态成员(例如:initializator* initializator :: instance;),但现在对我没有帮助。

您正在声明CTOR,但没有定义它您可以在

的类声明中定义它
     Initializator() = default;

     Initializator(){};

或在CPP中

     Initializator::Initializator(){}

正如错误消息所说的那样,initializator :: createInstance()正在调用ctor,即使它是私有的

,也必须定义。

将您的默认ctor声明为private禁止创建隐式定义的默认ctor。因此,您会得到unresolved external symbol链接器错误。
为了使其正常工作,请在您的代码中提供有效的ctor定义。
.cpp文件中,或在.hpp文件中(通过提供课堂定义或编写ctor() = default强迫编译器自动生成默认的构造函数)。

相关文章: