日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++设计模式之三 单例模式

發(fā)布時(shí)間:2023/12/10 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++设计模式之三 单例模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

《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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。