亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++文件的依賴關系

2020-02-24 14:35:28
字體:
來源:轉載
供稿:網友

如果你正要學習或者對于C++比較上心的朋友可以看看此文,或許能給你意想不到的收獲喔,那閑話不多說了,一起來了解下C++文件的依賴關系。

首先我不給出依存關系的定義,我給出一個例子。


?class Peopel{
?public:
???? People(const std::string & name,const Date& brithday,Image Img)
???? std::string name( ) const;
???? Date birthDate( ) const;
???? Image img( ) const;
???? ...
?private:
???? std::string theName;?????????????? //名字
???? Date theBirthDate;???????????????? //生日
???? Image img;???????????????????????? //圖片
?};


如果編譯器沒有知道類string,Date和Image的定義,class People是無法通過編譯的。一般該定義式是由#include包含的頭文件所提供的,所以一般People上面有這些預處理命令

?

?


? #include
? #include "date.h"
? #inblude "image.h"
?class Peopel{
?public:
???? People(const std::string & name,const Date& brithday,Image Img)
???? std::string name( ) const;
???? Date birthDate( ) const;
???? Image img( ) const;
???? ...
?private:
???? std::string theName;?????????????? //名字
???? Date theBirthDate;???????????????? //生日
???? Image img;???????????????????????? //圖片
?};


那么這樣People定義文件與該三個文件之間就形成了一種編譯依存關系。如果這些頭文件任何一個文件被改變,或這些頭文件所依賴其他頭文件任何改變,那么每一個包含People類的文件就需要重新編譯,使用People類文件也需要重新編譯。想想如果一個項目包含一個上千的文件,每個文件包含其他幾個文件,依次這樣下來,改動一個文件內容,那么就需要幾乎重新編譯整個項目了,這可以說很槽糕了。

?

我們可以進行如下改動


?namespace std {
???? class string;
?}
?class Date;
?class Image;

?class Peopel{
?public:
???? People(const std::string & name,const Date& brithday,Image& Img)
??? std::string name( ) const;
??? Date birthDate( ) const;
??? Image img( ) const;
??? ...
private:
??? std::string theName;??????????????? //名字
??? Date theBirthDate;???????????????? //生日
??? Image img;???????????????????????? //圖片
};


這樣只有People該接口被改變時才會重新編譯,但是這樣有連個問題,第一點string不是class,它是個typedef basic_string string。因此上述前置聲明不正確(附其在stl完全代碼);,正確的前置聲明比較復雜。其實對于標準庫部分,我們僅僅通過#include預處理命令包括進來就可以了。

?

?


?#ifndef __STRING__
?#define __STRING__

?#include

?extern "C++" {
?typedef basic_string string;
?// typedef basic_string wstring;
?} // extern "C++"

?

#endif


前置聲明還有一個問題,就是編譯器必須在編譯期間知道對象的大小,以便分配空間。
例如:

?

?


? int main(int argv,char * argc[ ])
??? {
??????? int x;
??????? People p( 參數 );
??????? ...
??? }


當編譯器看到x的定義式,它知道必須分配多少內存,但是看到p定義式就無法知道了。但是如果設置為指針的話,就清楚了,因為指針本身大小編譯器是知道的。

?

?


#include
#include

?

class PeopleImpl;
class Date;
class Image;
class People{
public:
?? People(const std::string & name, const Date& brithday, const Image &Img);
?? std::string name( ) const;
?? Date birthDate( ) const;
?? Imge img( ) const;
?? ...
private:
?? PeopleImpl * pImpl;
}


PeopleImpl包含下面這三個數據,而People的成員變量指針指向這個PeopleImpl,那么現在編譯器通過People定義就知道了其分配空間的大小了,一個指針的大小。

?

?


?public PeopleImpl
?{
???? public:
???????? PeopleImple(...)
???????? ...
???? private:
???????? std::string theName;??????????????? //名字
???????? Date theBirthDate;???????????????? //生日
???????? Image img;???????????????????????? //圖片


這樣,People就完全與Date、Imge以及People的實現分離了上面那些類任何修改都不需要重新編譯People文件了。另外這樣寫加強了封裝。這樣也就降低了文件的依存關系。
這里總結下降低依存性方法:

?

?

?

1.如果可以類聲明就不要使用類定義了。
2.將數據通過一個指向該數據的指針表示。
3.為聲明式和定義式提供不同的頭文件。
  這兩個文件必須保持一致性,如果有個聲明式被改變了,兩個文件都得改變。因此一般會有一個#include一個聲明文件而不是前置聲明若干函數。
  像People這樣定?
?


?#include "People.h"
?#include "PeopleImpl.h"

?People::People(const std::string& name, const Date& brithday, const Image& Img)
?:pImpl(new PersonImpl(name,brithday,addr))
?{ }
?std::string People::name( ) const
?{
???? return pImpl->name( );
?}


而另外一種Handle類寫法是令People成為一種特殊的abstract base class稱為Interface類。看到interface這個關鍵字或許熟悉C#、java的同學可能已經恍然大悟了。這種接口它不帶成員變量,也沒有構造函數,只有一個virtual析構函數,以及一組純虛函數,用來表示整個接口。針對People而寫的interface class看起來是這樣的。

?

?


?class People{
?public:
???? virtual ~People( );
???? virtual std::string name( ) const = 0;
???? virtual Date brithDate( ) const =0;
???? virtual Image address( ) const =0;
???? ...
?};


怎么創建對象呢?它們通常調用一個特殊函數。這樣的函數通常稱為工廠函數或者虛構造函數。它們返回指針指向動態分配所得對象,而該對象支持interface類的接口。

?

?


?? class People {
???? public:
???????? ...
???????? static People* create(const std::string& name,const Date& brithday, const Image& Img);
???? };


支持interface類接口的那個類必須定義出來,而且真正的構造函數必須被調用

?

?


?class RealPeople:public People{
?public:
???? RealPeople(const std::string& name,const Date& birthday,const Image& Img)
???? :theName(name),theBrithDate(brithday),theImg(Img)
?{}
???? virtual ~RealPeople() { }
???? std::string name( ) const;
???? Date birthDate( ) const;
???? Image img( ) const;
?private:
???? std::string theName;
???? Date theBirthDate;
???? Image theImg;
?}


有了RealPeople類,我們People::create可以這樣寫

?

?


?People* People::create(const std::string& name, const Date& birthday, const Image& Img)
?{
???? return static_cast(new RealPerson(name,birthday,Img));
?}


Handle類與interface類解除了接口和實現之間的耦合關系,從而降低了文件間的編譯依存性。但同時也損耗了一些性能與空間。

以上就是C++文件的依賴關系的介紹,如果大家想了解更多相關內容,請持續關注本站,本站小編將在第一時間為大家帶來更好的經典內容。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人a成www在线影院| 一级做a爰片久久毛片美女图片| 中文字幕久热精品视频在线| 欧美性xxxxxxxxx| 精品国产乱码久久久久酒店| 亚洲女人天堂av| 日韩免费精品视频| 亚洲999一在线观看www| 亚洲第一区在线观看| 91高清视频免费观看| 亚洲精品电影在线观看| 国产精品99导航| 成人性教育视频在线观看| 欧美国产日韩一区二区在线观看| 亚洲第一国产精品| 国产视频精品在线| 国产在线精品一区免费香蕉| 亚洲一区二区三区视频| 插插插亚洲综合网| 尤物99国产成人精品视频| 久久91精品国产91久久跳| 亚洲精品一区中文| 丝袜美腿亚洲一区二区| 91牛牛免费视频| 精品偷拍各种wc美女嘘嘘| 欧美一级黑人aaaaaaa做受| 91豆花精品一区| 亚洲人午夜精品免费| 98精品国产自产在线观看| 超碰日本道色综合久久综合| 亚洲一级片在线看| 亚洲福利视频在线| 欧美午夜影院在线视频| 亚洲va国产va天堂va久久| 亚洲精品第一页| 欧美性videos高清精品| 亚洲免费福利视频| 亚洲一区二区中文字幕| 国产精品黄色影片导航在线观看| 亚洲高清一区二| 日韩av电影国产| 97视频在线观看视频免费视频| 国产一区视频在线播放| 神马国产精品影院av| 国产精品九九久久久久久久| 国产精品成人一区二区| 国内精品久久久久伊人av| www高清在线视频日韩欧美| 久久久久成人网| 亚洲精品网站在线播放gif| 日韩在线视频网站| 国产精品久久久久久久久久久久久| 亚洲精品综合久久中文字幕| 91美女片黄在线观看游戏| 最新亚洲国产精品| 中文字幕亚洲一区二区三区五十路| 国产精品中文在线| 日韩欧美一区二区在线| 国产日产欧美精品| 97久久超碰福利国产精品…| 日本精品一区二区三区在线| 亚洲精品一区二区三区不| 国产成人精品在线| 日韩精品中文字| 欧美黑人巨大xxx极品| 国产成一区二区| 国产精品电影网站| 国产精品一久久香蕉国产线看观看| 奇门遁甲1982国语版免费观看高清| 亚洲精品一区二区网址| 性色av一区二区三区红粉影视| 日韩a**中文字幕| 精品亚洲国产成av人片传媒| 久久99精品久久久久久青青91| 亚洲人午夜色婷婷| 欧美在线视频播放| 久久精视频免费在线久久完整在线看| 亚洲欧美在线x视频| 欧美丰满少妇xxxxx| 国产精品丝袜久久久久久不卡| 日韩有码在线视频| 欧美国产日韩xxxxx| 中文字幕精品影院| 久久精品国产清自在天天线| 国产www精品| 日韩在线播放视频| 91精品视频一区| 国产91色在线播放| 一二美女精品欧洲| 在线激情影院一区| 国产精品一久久香蕉国产线看观看| 性色av一区二区三区红粉影视| 国产美女被下药99| 日韩女优在线播放| 欧美日韩国产丝袜美女| 日韩成人xxxx| 久久久久亚洲精品| 国产91精品在线播放| 国产免费久久av| 欧美激情一区二区三区久久久| 欧美黑人性猛交| 成人网中文字幕| 久久全球大尺度高清视频| 97视频在线观看网址| 欧美一级片久久久久久久| 日韩av综合中文字幕| 亚洲欧美一区二区三区四区| 国产精品久久久久久久久久久久| 国产视频福利一区| 久久69精品久久久久久国产越南| 91免费观看网站| 另类少妇人与禽zozz0性伦| 国内精品在线一区| 69久久夜色精品国产7777| 国产精品久久久久久亚洲影视| 欧美丰满少妇xxxxx做受| 日本高清久久天堂| 国产精品成人久久久久| 亚洲91精品在线| 亚洲精品福利在线观看| 欧美日韩国产精品一区二区不卡中文| 亚洲第一精品久久忘忧草社区| 亚洲精品美女在线| 日韩69视频在线观看| 午夜精品久久久久久久久久久久久| 精品久久中文字幕| 日韩精品一区二区三区第95| 国产一区二区三区视频在线观看| 国产精品丝袜一区二区三区| 国产精品h片在线播放| 精品国产依人香蕉在线精品| 久久九九国产精品怡红院| 久久精品成人欧美大片古装| 欧美肥婆姓交大片| 国产精品久久久久久中文字| 国产综合久久久久| 久久91精品国产91久久久| 日韩精品视频在线免费观看| 成人黄色短视频在线观看| 中文精品99久久国产香蕉| 久久精品国产精品亚洲| 久久精品电影网| 97人洗澡人人免费公开视频碰碰碰| 亚洲成人激情小说| 精品日韩美女的视频高清| 日本欧美爱爱爱| 中文字幕亚洲一区二区三区五十路| 亚洲免费人成在线视频观看| 国产精品久久久久久久久久久久久久| 国产一区二区三区精品久久久| 91性高湖久久久久久久久_久久99| 精品视频久久久久久| 伊人伊人伊人久久| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲电影在线看| 亚洲免费精彩视频| 国产剧情久久久久久| 日韩av电影手机在线观看| 欧美日韩免费区域视频在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 日韩精品在线私人| 久久国产精彩视频| 日韩一区二区三区在线播放| 伊人av综合网|