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()得到的是同一个实例对象,这也就实现了单例模式。
单例类有以下特征:
- 它有一个指向该类唯一实例的静态指针,并且是私有的;
- 它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;
- 它的构造函数是私有的,这样就不能从别处创建该类的实例。
- 程序运行结束时,系统会调用析构函数,该析构函数会删除单例的唯一实例。
注意:
类中的静态成员变量的初始化必须在类外实现