读书人

单件模式的困惑-请帮助解决,该如何解决

发布时间: 2012-02-08 19:52:21 作者: rapoo

单件模式的困惑----请帮助解决
根据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;

只有定义没有实现是不行的
静态变量也应在外面进行初始化

读书人网 >C++

热点推荐