读书人

请啊设计模式之单例模式(C++代码

发布时间: 2012-04-20 15:27:03 作者: rapoo

请高手指点啊——设计模式之单例模式(C++代码实现)
设计模式之单例模式

各位,
我用C++写了设计模式中的单例模式,但是链接时有点问题,还请高手多多指教啊,多谢了。

#include <iostream>

using namespace std;

class Singleton
{
private:
static Singleton *instance;

Singleton()
{
}

public:

static Singleton *GetInstance()
{
if (NULL == instance)
{
instance = new Singleton();
}
return instance;
}
};

int main()
{
Singleton *p1 = Singleton::GetInstance();
Singleton *p2 = Singleton::GetInstance();

if (p1 == p2)
{
cout<<"Two objects is the same instance"<<endl;
}

return 1;
}

在VC++6.0下链接时显示错误:

--------------------Configuration: test - Win32 Debug--------------------
Compiling...
test.cpp
Linking...
test.obj : error LNK2001: unresolved external symbol "private: static class Singleton * Singleton::instance" (?instance@Singleton@@0PAV1@A)
test___Win32_Debug/test.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

test.exe - 2 error(s), 0 warning(s)





[解决办法]
static Singleton *instance;

对它在类外部初始化一下
[解决办法]
class Singleton
{
private:
static Singleton *instance;

Singleton()
{
}

public:

static Singleton *GetInstance()
{
if (NULL == instance)
{
instance = new Singleton();
}
return instance;
}
};

Singleton *Singleton::instance = NULL; // Attention !

int main(int argc, char* argv[])
{
Singleton *p1 = Singleton::GetInstance();
Singleton *p2 = Singleton::GetInstance();

if (p1 == p2)
{
cout<<"Two objects is the same instance" <<endl;
}

//system("PAUSE");
return 0;
}
[解决办法]
兄弟,singleton是不用new的。如果用了new,在什么地方去delete它呢?singleton原理的基础是局部static变量。

C/C++ code
class       Singleton  {  private:          static       Singleton       *instance;                 Singleton()          {          }         public:                                 static       Singleton       *GetInstance()          {                  static Singleton singleton;                return &singleton        }  };
[解决办法]
你这个方法实现singleton不太好,会有多线程同步问题。
比如说一开始Singleton::instance为空。然后有线程A和线程B同时访问Singleton::GetInstance()。
有意思的是当任务A执行if (NULL == instance)这句时,刚判断好instance确实为空想调用new,或者时间可以再放款到正在执行new操作,但是还没有返回;要命的是调度器由于某些原因一下子剥夺了线程A的执行又去执行线程B了。线程B顺利地创建了一个instance实例,然后在某一时刻被调度器剥夺,再次执行线程A。OK,此时线程A从刚才的混沌中继续执行它的new Singleton()的操作,这样线程A所创建出来的就是另一个实例了。此时Singleton宣告破灭。

因此,能够迎合多线程,乃至多处理的单件处理可以用以下方式:
C/C++ code
class Singleton   {   private:           static Singleton instance;                   Singleton(void)           {           }           public:                                   static Singleton& GetInstance()           {            return instance;        }};Singleton Singleton::instance; 

读书人网 >C++

热点推荐