【问题标题】:Unresolved external symbol in singleton单例中未解析的外部符号
【发布时间】:2017-02-23 20:57:53
【问题描述】:

我有这样的代码:

#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();
    }

}

但是我的编译器有问题:

严重性代码描述项目文件行抑制状态 函数“public:static void __cdecl mv::Initializator::createInstance(void )" (?createInstance@Initializator@mv@@SAXXZ)

我无法理解它,因为我有其他类的代码非常相似并且编译器没有遇到问题。过去,当我遇到这个问题时,我必须在 .cpp 文件中声明静态成员(例如:Initializator* Initializator::instance; )但现在它对我没有帮助。

【问题讨论】:

  • 这是什么编程语言?是 C++ 吗?请用使用的语言标记您的问题。要更新您的问题,请点击帖子下方的 "edit" 链接。谢谢。

标签: c++ external symbols


【解决方案1】:

您正在声明 ctor,但没有定义它 您可以在类声明中定义它

     Initializator() = default;

或者

     Initializator(){};

或者也可以在cpp中使用

     Initializator::Initializator(){}

正如错误消息所说,Initializator::createInstance() 正在调用 ctor,即使它是私有的也必须定义

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 2015-06-27
      相关资源
      最近更新 更多