1. 程式人生 > >類裡面定義一個指向自己的靜態成員指標變數

類裡面定義一個指向自己的靜態成員指標變數

程式碼:
class a
{
 public:
        void  printa() { cout<<"class a";}
 public:
       static a* my;
}
解釋:
在類裡面定義自己的一個靜態變數,當這個類的所有物件都需要與某個同類的物件發生關係(不要想歪了……)時,就這麼用。這個靜態成員一般是全域性存在的(廢話),而且有特殊地位的物件。有一個很形象的例子與此類似:
好比有一個部落,對部落裡的人,可以用 class CHuman 來抽象,但是這個部落裡有個特殊的人,那就是這個部落的始祖,例如穆罕穆德。這個特殊的人當然也是 class CHuman 的物件,但區別是他同 CHuman 的所有物件都有關聯,或者說 CHuman 的所有物件都和這個物件有關聯————所有人都必須時刻記著始祖,而且禱告時都必須“引用”始祖物件,遇到災難時更要祈求始祖的保佑,吃飯前也要“引用”他的名字……
顯然,這個部落的所有成員都與這個特殊成員存在關聯(用UML的術語,叫“連結”),對這種模式進行抽象的最佳方式,就是在 class CHuman 內部定義一個“本類”的靜態物件(或該物件的指標或引用)。每個成員都可以時刻(而且是“先天”的,不可被“俗世”所篡改的)與始祖發生聯絡,從他那裡汲取神祕的力量……

//執行緒控制類
class ThreadControl {
public:
  static ThreadControl * GetInstance();
  virtual ~ThreadControl();
 
protected:
  static ThreadControl* thread_control_;//指向類本身的靜態類成員
  explicit ThreadControl();
  ThreadControl(const ThreadControl &);
  ThreadControl & operator =(const ThreadControl &);
public:
  ThreadPool thread_pool;
};


//執行緒控制建構函式
ThreadControl::ThreadControl()
  : thread_pool(20)//開啟執行緒上限為20的執行緒池
{
}

//執行緒池類
class ThreadPool {
public:
  ThreadPool & operator =(const ThreadPool &) = delete;
  ThreadPool(const ThreadPool& other)         = delete;
 
  ThreadPool(int32_t threads);

  virtual ~ThreadPool();
 };
 
 //得到類的例項
ThreadControl * ThreadControl::GetInstance()
{
  if (!thread_control_)
  {
    thread_control_ = new ThreadControl;
  }
  return thread_control_;
}

inline ThreadPool::ThreadPool(int32_t threads)
{
  //開啟執行緒池
}


//根據不同型別開啟不同處理執行緒
case A:
        ThreadControl::GetInstance()->thread_pool.X();
case B:
      {
        ThreadControl::GetInstance()->thread_pool.X();
      }

 case C:
      {
        ThreadControl::GetInstance()->thread_pool.X();
      }

 case D:
      {
        ThreadControl::GetInstance()->thread_pool.X();
      }

 case E:
      {
        ThreadControl::GetInstance()->thread_pool.X();
      }

    在上面的程式碼中,我有一個疑問:當根據不同型別開啟不同處理執行緒時,都會呼叫

ThreadControl * ThreadControl::GetInstance()
{
  if (!thread_control_)
  {
    thread_control_ = new ThreadControl;
  }
  return thread_control_;
}

新建一個執行緒控制物件,賦值給指向自己的靜態指標成員,都知道靜態成員會保留最新的賦值,在新建物件時都會呼叫執行緒控制建構函式

//執行緒控制建構函式
ThreadControl::ThreadControl()
  : thread_pool(20)//開啟執行緒上限為20的執行緒池
{
}

相當於每次處理不同的資料時,都會新建一個執行緒池(20個執行緒),由於函式

ThreadControl * ThreadControl::GetInstance()

中有一個判斷語句,判斷 thread_contron 是否為空,保證了只有一次例項化。而實際上,新增指向自己的靜態指標成員,目的就是在整個程式執行中只例項化一次,整個程式中GetInstance得到的是同一個例項物件,請教前輩說這是設計模式中的單例模式的內容