对智能指针的学习
来源:互联网 发布:单片机学习网站 编辑:程序博客网 时间: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,补充的具体的实例。*/