C++类里面定义一个指向自己的静态成员函数

【使用示例】
在头文件中声明一个类,定义一个指向该类本身的静态成员指针变量,实现单例模式

class Test
{
public:
    ~Test();
    static Test* Instance();
private:
    Test();
    static Test*             m_pTest; 
    bool                         m_bStatus;
    std:: string              m_strValue;
};

注意static成员一定要在类外初始化

因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
static数据成员在类外初始化和定义是为了保证它只被初始化和定义一次,这样编译器就不必考虑类的函数里面第一个对static变量的’=’操作是赋值还是初始化了。

实现代码:

#include "test.h"

Test* Test::m_pTest = NULL;
Test::Test()
{
}

Test::~Test()
{
    if (NULL != m_pTest) {
        delete m_pTest;
        m_pTest = NULL;
    }
}

Test* Test::Instance()
{
    if (NULL != m_pTest) {
        m_pTest = new Test();
        m_bStatus = true;
        m_strValue = "test";
    }

    return m_pTest;
}

void Test::print()
{
    m_bStatus = true;
    m_strValue = "test";
    std::cout << "m_bStatus: " << m_bStatus << std::endl;
    std::cout << "m_strValue: " << m_strValue << std::endl;
}


int main ()
{
    Test * test = Test::Instance();
    std::cout << "****test start****" << std::endl;
    test->print();

    return 0;
}
定义一个“本类”的静态对象(或该对象的指针或引用),这个静态成员一般是全局存在的,每个成员都可以时刻与这个特殊的类对象有关联。
在实现中判断m_pTest是否为空,是保证了只进行一次实例化。而实际上,添加指向自己的静态指针成员,目的就是在整个程序运行中只实例化一次,整个程序中调用Instance()得到的是同一个实例对象,这也就实现了单例模式。

单例类有以下特征:

  • 它有一个指向该类唯一实例的静态指针,并且是私有的;
  • 它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;
  • 它的构造函数是私有的,这样就不能从别处创建该类的实例。
  • 程序运行结束时,系统会调用析构函数,该析构函数会删除单例的唯一实例。

注意:
   类中的静态成员变量的初始化必须在类外实现

posted on 2020-04-14 15:19  JJ_S  阅读(1743)  评论(0编辑  收藏  举报