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