单件模式的困惑----请帮助解决
根据MSDN文档有:
class Singleton
{
private:
static Singleton* instance;
protected:
Singleton(void);
public:
~Singleton(void);
static Singleton* Instance()
{
if (instance)
{
instance=new Singleton();
}
return instance;
}
CString name;
};
在VC++6.0或VS2005 C++ 中建立基于对话框的程序
在对话框类中加入
Singleton* m_user;
在对话框类的OnInitDialog()中加入
m_user=Singleton::Instance();
m_user-> name= "adfs ";
编译出问题:
singleton_vcDlg.obj : error LNK2001: unresolved external symbol "protected: __thiscall Singleton::Singleton(void) " (??0Singleton@@IAE@XZ)
singleton_vcDlg.obj : error LNK2001: unresolved external symbol "private: static class Singleton * Singleton::instance " (?instance@Singleton@@0PAV1@A)
Debug/singleton_vc.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
请高手指点,谢谢
[解决办法]
这个写cpp文件里没啊?
Singleton* Singleton::instance = 0;
[解决办法]
建立如下实现
class Singleton
{
protected:
Singleton();
public:
~Singleton();
static Singleton* Instance()
{
static Singleton instance;
return &instance;
}
};
[解决办法]
singleton_vcDlg.obj : error LNK2001: unresolved external symbol "protected: __thiscall Singleton::Singleton(void) " (??0Singleton@@IAE@XZ)
这个错误是, 构造没有实现
singleton_vcDlg.obj : error LNK2001: unresolved external symbol "private: static class Singleton * Singleton::instance " (?instance@Singleton@@0PAV1@A)
这个错误是静态变量没有定义, 就是cunsh说得Singleton* Singleton::instance = 0;
要写在cpp中。
另外singleton的实现有个错误。这段code,
if (instance)
{
instance=new Singleton();
}
return instance;
应该是if (!instance)
使用singleton的时候, 不用定义Singleton* m_user;
直接调用Singleton::Instance()-> name= "adfs "; 就可以了, 因为这个单件是个静态变量。
不过语言的功底不够强的时候, 暂且先不要看太多模式, 否则会造成很多干扰。 现在singleton已经是公认的被滥用的模式了, 模式与重构一书已经很反对用singleton, 甚至有一章专门介绍如果内联掉singleton.
[解决办法]
singleton_vcDlg.obj : error LNK2001: unresolved external symbol "protected: __thiscall Singleton::Singleton(void) " (??0Singleton@@IAE@XZ)
构造函数参数为void //Singleton::Singleton(void)
而class中 instance=new Singleton();没有传参数
建议:将Singleton::Singleton(void)改为Singleton::Singleton()
singleton_vcDlg.obj : error LNK2001: unresolved external symbol "private: static class Singleton * Singleton::instance " (?instance@Singleton@@0PAV1@A)
表示static变量instance没有初始化,添加上
Singleton * Singleton::instance = NULL;
[解决办法]
只有定义没有实现。需要加上CPP文件提供protected ctor的实现
[解决办法]
#define DECLARE_SINGLETON(ClassName); \
public: \
static ClassName& GetInstanceRef() \
{ \
static ClassName _instance; \
return _instance; \
} \
static const ClassName& GetInstanceConst() \
{ \
return GetInstanceRef(); \
} \
static ClassName* GetInstancePtr() \
{ \
return &GetInstanceRef(); \
} \
private: \
ClassName(const ClassName&){} \
ClassName& operator=(const ClassName&) \
{ \
return GetInstanceRef(); \
} \
private: \
static void operator delete(void *p, size_t n) \
{ \
; /* 嘿嘿,什么都不要做.
但要注意,析构函数已经执行。
但对象并没有真正从内存卸载掉。*/ \
}//End of define DECLARE_SINGLETON(ClassName);
class MySingleton3
{
DECLARE_SINGLETON(MySingleton3);
private:
MySingleton3(){ cout < < _T( "Construct MySingleton3 ") < < endl; }
public:
~MySingleton3(){ cout < < _T( "Destroy MySingleton3 ") < < endl; }
public:
void DoSomething(){ cout < < _T( "Do something here in MySingleton3 ") < < endl; }
};
实现Singleton的代码就一个宏定义而已,而使用它来使一个类拥有Singleton属性也只是调用一下这条宏。从使用上来看它应该是最简单的,看看下面的测试代码:
MySingleton3 *myobj3 = MySingleton3::GetInstancePtr();
myobj3-> DoSomething();
delete myobj3;
MySingleton3::GetInstanceRef().DoSomething();
[解决办法]
Singleton* Singleton::instance = 0;
静态变量需要初始化!
[解决办法]
静态变量初始化,与该模式无关。
[解决办法]
class Singleton
{
private:
static Singleton* instance;
protected:
Singleton(void)
{
}
public:
~Singleton(void)
{
}
static Singleton* Instance()
{
if (instance)
{
instance=new Singleton();
}
return instance;
}
CString name;
};
Singleton* Singleton::instance = NULL;
只有定义没有实现是不行的
静态变量也应在外面进行初始化