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
为什么会不通过?
大家讲道理2017-04-17 13:36:10
You need to add a sentence
Singleton * Singleton::m_instance = 0;
otherwise there will be a link error
阿神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
};