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()得到的是同一個實例對象,這也就實現了單例模式。

單例類有以下特征:

  • 它有一個指向該類唯一實例的靜態指針,並且是私有的;
  • 它有一個公有的函數,可以獲取這個唯一的實例,並且在需要的時候創建該實例;
  • 它的構造函數是私有的,這樣就不能從別處創建該類的實例。
  • 程序運行結束時,系統會調用析構函數,該析構函數會刪除單例的唯一實例。

注意:
   類中的靜態成員變量的初始化必須在類外實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM