《Singleton.h》
#include<iostream>
#include<string>
using namespace std;
class A{
public:
static A* GetInstance();
void ShowAddress();
private:
A();
virtual ~A();
static A* m_p;
};
《Singleton.cpp》
#include "Singleton.h"
A*A::m_p = NULL;
A::A()
{
cout <<"Construct Fun"<<endl;
}
A::~A()
{
delete m_p;
cout <<"Deconstruct Fun"<<endl;
}
A* A::GetInstance()
{
if ( m_p == NULL )
{
m_p = new A();
}
return m_p;
}
void A::ShowAddress()
{
cout <<"SHOW AS"<<endl;
}
int main()
{
A::GetInstance()->ShowAddress();
return 0;
}
總結特點:
1、單例模式要求只能聲明一個對象執行個體,為了保證則將建構函式聲明為私人。
2、聲明一個私人成員static對象執行個體指標,並在定義時初始化。
3、聲明一個public的static成員函數,作用來擷取該執行個體,在該函數定義時候,需要時建立執行個體。
調試時候遇到的問題:
在定義執行個體擷取函數時候,我將該函數寫成
static A* A::GetInstance()
{
if ( m_p == NULL )
{
m_p = new A();
}
return m_p;
}
加了一個“static”結果導致連結時候出錯,提示“static' should not be used on member functions defined at file scope”,後來查資料才明白,此處不能加static。
總結原因如下:
問題原因:static 不能在檔案地區內定義!也就是說不能在類裡面定義,必須先在類裡面聲明然後在類外定義!
簡單的說,static是針對於類的,而不是對象的,所有的對象都使用該static,原在類中聲明的static成員函數,如果在定義時,加上static修飾符的話,每個對象都來操作屬於所有對象(類)的東西,豈不是會亂套,所以不能允許這種行為。同理,針對於static變數一樣,定義時不能加static。
下面來自於網友針對於該問題的分析,我感覺很有道理,貼過來學習一下:
錯誤提示:pure specifier can only be specified for functions
問題原因:不能在類裡邊賦static資料成員的初值
錯誤提示:'static' should not be used on member functions defined at file scope
問題原因:static 不能在檔案地區內定義!也就是說不能在類裡面定義,必須先在類裡面聲明然後在類外定義!
總結(轉載如下)
1. 待用資料成員static data member 是 類的,而不是僅屬於某個對象的,該類的所有對象都可以調用它,類也可以調用。對象可調用它,但不是獨佔。生存期:編譯時間就分配,程式結束才釋放空間。他只能在類體外初始化。範圍:與定義它的類的範圍相同,即與類同在。他的存在是為了對象間的共同交流。
2. 靜態成員函數Static member function 是為了調用static data member 而存在。Compile 不為他分配this 指標,所以他不能調用對象 的非static data member。當你非要調用 非Static data member 時,只要 指明對象就行了(因為沒有compile 沒有為類的static member function 指定 this
指標,所以引用 非靜態成員變數時分不清是哪個對象的,當你指明對象來調用不就行了。)
加了static 限制符的data member or member function 只是限制了調用的權利,並沒有限制 被調用的權利。非static 的對象和非static的member function 都可以調用他們。