对智能指针的学习

来源:互联网 发布:单片机学习网站 编辑:程序博客网 时间:2024/06/01 09:59
//这个singleton用的是别人写的。
#ifndef _Singleton_h_#define _Singleton_h_#include <iostream>#include <pthread.h>class Mutex{public:    Mutex()    {        pthread_mutex_init(&m_lock,NULL);    }    ~Mutex()    {        pthread_mutex_destroy(&m_lock);    }    void Lock()   {        pthread_mutex_lock(&m_lock);    }    void UnLock()    {        pthread_mutex_unlock(&m_lock);    }private:    pthread_mutex_t m_lock;};template<class T>class Singleton{public:    static T*    GetInstance();static void  Destroy();private:Singleton() ;~Singleton();   static T* m_pInstance;   static Mutex m_mutex;};template<class T>T* Singleton<T>::m_pInstance = 0;template<class T>Mutex Singleton<T>::m_mutex;template<class T>T* Singleton<T>::GetInstance(){    if (m_pInstance)    {    std::cout << "Already have an instance.\n";        return m_pInstance;   }    m_mutex.Lock();   if (NULL == m_pInstance)    {   std::cout << "Create new instance.\n";        m_pInstance = new T;    }  m_mutex.UnLock();    return m_pInstance;}template<class T>void Singleton<T>::Destroy(){    if (m_pInstance)   {       delete m_pInstance;        m_pInstance= NULL;    }}#endif
#include <iostream>//#include <exception>#include <tr1/memory>#include "Singleton.h"using namespace std;struct PMImpl{PMImpl(const string& bstring);std::tr1::shared_ptr<string> bgstring;int stringChanges;               // # of times string has been changed};PMImpl::PMImpl(const string& bstring):bgstring(new string(bstring)),stringChanges(0){}class PrettyMenu {public:  void changeString(string& imgSrc);           // change background  void dump()const{  cout << *(pImpl.get()->bgstring) << endl;    }private:  PrettyMenu(const string& bstring="hello");  ~PrettyMenu(){};  friend class Singleton<PrettyMenu>;  Mutex mutex;                    // mutex for this object  std::tr1::shared_ptr<PMImpl> pImpl;};PrettyMenu::PrettyMenu(const string& bstring):pImpl(new PMImpl(bstring)){}void PrettyMenu::changeString(string& imgSrc){std::tr1::shared_ptr<struct PMImpl> pNew(new PMImpl(*pImpl));pNew->bgstring.reset(new string(imgSrc));++pNew->stringChanges;swap(pImpl,pNew);}typedef Singleton<PrettyMenu> AA;
int main(){PrettyMenu *b = AA::GetInstance();b->dump();string aa("1");b->changeString(aa);cout << "ok" << endl;b->dump();cout << "yes" << endl;return 0;}

/*后面的代码是自己根据高效C++第3版条款29,补充的具体的实例。*/
原创粉丝点击