类里面定义一个指向自己的静态成员指针变量

转自:https://blog.csdn.net/legionmation/article/details/30982205?utm_source=blogxgwz5

代码:
class a
{
 public:
        void  printa() { cout<<"class a";}
 public:
       static a* my;
}
解释:
在类里面定义自己的一个静态变量,当这个类的所有对象都需要与某个同类的对象发生关系(不要想歪了……)时,就这么用。这个静态成员一般是全局存在的(废话),而且有特殊地位的对象。有一个很形象的例子与此类似:
好比有一个部落,对部落里的人,可以用 class CHuman 来抽象,但是这个部落里有个特殊的人,那就是这个部落的始祖,例如穆罕穆德。这个特殊的人当然也是 class CHuman 的对象,但区别是他同 CHuman 的所有对象都有关联,或者说 CHuman 的所有对象都和这个对象有关联————所有人都必须时刻记着始祖,而且祷告时都必须“引用”始祖对象,遇到灾难时更要祈求始祖的保佑,吃饭前也要“引用”他的名字……
显然,这个部落的所有成员都与这个特殊成员存在关联(用UML的术语,叫“链接”),对这种模式进行抽象的最佳方式,就是在 class CHuman 内部定义一个“本类”的静态对象(或该对象的指针或引用)。每个成员都可以时刻(而且是“先天”的,不可被“俗世”所篡改的)与始祖发生联系,从他那里汲取神秘的力量……

转自:https://blog.csdn.net/QTVLC/article/details/82701280?utm_source=blogxgwz0

//线程控制类
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得到的是同一个实例对象,请教前辈说这是设计模式中的单例模式的内容
 

猜你喜欢

转载自blog.csdn.net/qq_38446366/article/details/83301851
今日推荐