Home  >  Q&A  >  body text

c++单例类编译不通过

class Singleton
{
private:
    static Singleton* m_instance;
    Singleton() {}
public:
    static Singleton* getInstance();
};

Singleton* Singleton::getInstance()
{
    if (m_instance==nullptr)
    {
        if (m_instance==nullptr)
        {
            m_instance = new Singleton;
        }
    }
    return m_instance;
}


vs报错:
严重性    代码    说明    项目    文件    行    禁止显示状态

错误 LNK2001 无法解析的外部符号 "private: static class Singleton * Singleton::m_instance" (?m_instance@Singleton@@0PAV1@A) billapp C:\Users\Administrator\Documents\Visual Studio 2015\Projects\billapp\billapp\bill.obj 1
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 _main,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用 billapp C:\Users\Administrator\Documents\Visual Studio 2015\Projects\billapp\billapp\MSVCRTD.lib(exe_main.obj) 1


为什么会不通过?
阿神阿神2764 days ago864

reply all(2)I'll reply

  • 大家讲道理

    大家讲道理2017-04-17 13:36:10

    You need to add a sentence
    Singleton * Singleton::m_instance = 0;
    otherwise there will be a link error

    reply
    0
  • 阿神

    阿神2017-04-17 13:36:10

    The error may be related to the declaration of static members.

    In addition, the singleton pattern can be implemented using references to local static variables. Reference here.

    class S
    {
        public:
            static S& getInstance()
            {
                static S    instance; // Guaranteed to be destroyed.
                                      // Instantiated on first use.
                return instance;
            }
        private:
            S() {}                    // Constructor (the {} brackets) are needed here.
    
            // C++ 03
            // ========
            // Dont forget to declare these two. You want to make sure they
            // are unacceptable otherwise you may accidentally get copies of
            // your singleton appearing.
            S(S const&);              // Don't Implement
            void operator=(S const&); // Don't implement
    
            // C++ 11
            // =======
            // We can use the better technique of deleting the methods
            // we don't want.
        public:
            S(S const&)               = delete;
            void operator=(S const&)  = delete;
    
            // Note: Scott Meyers mentions in his Effective Modern
            //       C++ book, that deleted functions should generally
            //       be public as it results in better error messages
            //       due to the compilers behavior to check accessibility
            //       before deleted status
    };

    reply
    0
  • Cancelreply