首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-04-20 
请高手指点啊——设计模式之单例模式(C++代码实现)设计模式之单例模式各位,我用C++写了设计模式中的单例模式

请高手指点啊——设计模式之单例模式(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; 

热点排行