问题描述
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:UsersAdministratorDocumentsVisual Studio 2015Projectsbillappbillappbill.obj 1 严重性 代码 说明 项目 文件 行 禁止显示状态错误 LNK2019 无法解析的外部符号 _main,该符号在函数 'int __cdecl invoke_main(void)' (?invoke_main@@YAHXZ) 中被引用 billapp C:UsersAdministratorDocumentsVisual Studio 2015ProjectsbillappbillappMSVCRTD.lib(exe_main.obj) 1
为什么会不通过?
问题解答
回答1:需要在类声明外加上一句Singleton * Singleton::m_instance = 0;否则会有链接错误
回答2:错误可能跟静态成员的声明有关。
另外,单例模式可以使用局部静态变量的引用实现。参考这里。
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 Implementvoid 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};