【使用示例】
在頭文件中聲明一個類,定義一個指向該類本身的靜態成員指針變量,實現單例模式
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()得到的是同一個實例對象,這也就實現了單例模式。
單例類有以下特征:
- 它有一個指向該類唯一實例的靜態指針,並且是私有的;
- 它有一個公有的函數,可以獲取這個唯一的實例,並且在需要的時候創建該實例;
- 它的構造函數是私有的,這樣就不能從別處創建該類的實例。
- 程序運行結束時,系統會調用析構函數,該析構函數會刪除單例的唯一實例。
注意:
類中的靜態成員變量的初始化必須在類外實現