C++设计模式之三 单例模式
《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;
}
總結(jié)特點(diǎn):
1、單例模式要求只能聲明一個(gè)對(duì)象實(shí)例,為了保證則將構(gòu)造函數(shù)聲明為私有。
2、聲明一個(gè)私有成員static對(duì)象實(shí)例指針,并在定義時(shí)初始化。
3、聲明一個(gè)public的static成員函數(shù),作用來獲取該實(shí)例,在該函數(shù)定義時(shí)候,需要時(shí)創(chuàng)建實(shí)例。
調(diào)試時(shí)候遇到的問題:
在定義實(shí)例獲取函數(shù)時(shí)候,我將該函數(shù)寫成
static?A* A::GetInstance()
{
? ? if ( m_p == NULL )
{
? ? ? ? m_p = new A();
? ? }
? ? return m_p;
}
加了一個(gè)“static”結(jié)果導(dǎo)致鏈接時(shí)候出錯(cuò),提示“static' should not be used on member functions defined at file scope”,后來查資料才明白,此處不能加static。
總結(jié)原因如下:
問題原因:static 不能在文件區(qū)域內(nèi)定義!也就是說不能在類里面定義,必須先在類里面聲明然后在類外定義!
簡(jiǎn)單的說,static是針對(duì)于類的,而不是對(duì)象的,所有的對(duì)象都使用該static,原在類中聲明的static成員函數(shù),如果在定義時(shí),加上static修飾符的話,每個(gè)對(duì)象都來操作屬于所有對(duì)象(類)的東西,豈不是會(huì)亂套,所以不能允許這種行為。同理,針對(duì)于static變量一樣,定義時(shí)不能加static。
下面來自于網(wǎng)友針對(duì)于該問題的分析,我感覺很有道理,貼過來學(xué)習(xí)一下:
錯(cuò)誤提示:pure specifier can only be specified for functions
問題原因:不能在類里邊賦static數(shù)據(jù)成員的初值
錯(cuò)誤提示:'static' should not be used on member functions defined at file scope
問題原因:static 不能在文件區(qū)域內(nèi)定義!也就是說不能在類里面定義,必須先在類里面聲明然后在類外定義!
?
總結(jié)(轉(zhuǎn)載如下)
1.???????? 靜態(tài)數(shù)據(jù)成員static data member 是 類的,而不是僅屬于某個(gè)對(duì)象的,該類的所有對(duì)象都可以調(diào)用它,類也可以調(diào)用。對(duì)象可調(diào)用它,但不是獨(dú)占。生存期:編譯時(shí)就分配,程序結(jié)束才釋放空間。他只能在類體外初始化。作用域:與定義它的類的作用域相同,即與類同在。他的存在是為了對(duì)象間的共同交流。
2.???????? 靜態(tài)成員函數(shù)Static member function 是為了調(diào)用static data member 而存在。Compile 不為他分配this 指針,所以他不能調(diào)用對(duì)象 的非static data member。當(dāng)你非要調(diào)用 非Static data member 時(shí),只要 指明對(duì)象就行了(因?yàn)闆]有compile 沒有為類的static member function 指定 this 指針,所以引用 非靜態(tài)成員變量時(shí)分不清是哪個(gè)對(duì)象的,當(dāng)你指明對(duì)象來調(diào)用不就行了。)
?
加了static 限制符的data member or member function 只是限制了調(diào)用的權(quán)利,并沒有限制 被調(diào)用的權(quán)利。非static 的對(duì)象和非static的member function 都可以調(diào)用他們。
總結(jié)
以上是生活随笔為你收集整理的C++设计模式之三 单例模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: char * 转LPCTSTR若干方法
- 下一篇: s3c2440移植MQTT