做學(xué)校網(wǎng)站素材圖片大全百度網(wǎng)盤搜索引擎盤多多
c++ primer plus 第15章友,異常和其他:15.1.3 其他友元關(guān)系
提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加
15.1.3 其他友元關(guān)系
提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- c++ primer plus 第15章友,異常和其他:15.1.3 其他友元關(guān)系
- 15.1.3 其他友元關(guān)系
15.1.3 其他友元關(guān)系
除本章前面討論的,還有其他友元和類的組合形式,下面簡要地介紹其中的一些。假設(shè)由于技術(shù)進(jìn)步,出現(xiàn)了交互式遙控器。例如,交互式遙控器讓您能夠回答電視節(jié)目中的問題,如果回答錯誤,電視將在控制器上產(chǎn)生嗡嗡聲。忽略電視使用這種設(shè)施安排觀眾進(jìn)入節(jié)目的可能性,我們只看 C++的編程方面。新的方案將受益于相互的友情,一些Remote 方法能夠像前面那樣影響 Tv 對象,而一些 Tv 方法也能影響 Remote 對象。這可以通過讓類彼此成為對方的友元來實現(xiàn),即除了Remote是Tv的友元外,TV
還是 Remote的友元。需要記住的一點是,對于使用 Remote 對象的Tv方法,其原型可在 Remote 類聲明之前聲明,但必須在 Remote 類聲明之后定義,以便編譯器有足夠的信息來編譯該方法。這種方案與下面類似:
class Tv
{
friend class Remote;
public :void buzz(Remote & r);
}class Remote
{
friend class Tv;
public :void Bool volup(Tv&t){t.volup();}{...}
};
inline void Tv::buzz(Remote & r)
{
...
}
由于 Remote的聲明位于Tv聲明的后面,所以可以在類聲明中定義Remote::volup(),但Tv::buzz()方法必須在Tv聲明的外部定義,使其位于Remote 聲明的后面。如果不希望 buzz()是內(nèi)聯(lián)的,則應(yīng)在一個單獨的方法定義文件中定義它。
#15.1.4 共同的友元
需要使用友元的另一種情況是,函數(shù)需要訪問兩個類的私有數(shù)據(jù)。從邏輯上看,這樣的函數(shù)應(yīng)是每個類的成員函數(shù),但這是不可能的。它可以是一個類的成員,同時是另一個類的友元,但有時將函數(shù)作為兩個類的友元更合理。例如,假定有一個Probe類和一個 Analyzer 類,前者表示某種可編程的測量設(shè)備,后者表示某種可編程的分析設(shè)備。這兩個類都有內(nèi)部時鐘,且希望它們能夠同步,則應(yīng)該包含下述代碼行:
class Analyzer;//forward declaration
class Probe
{
friend void sync(Analyzer &a,const Probe & p);// sync a to pfriend
void sync(Probe &p,const Analyzer & a);// sync p to a
};class Analyzer{friend void sync(Analyzer &a,const Probe &p);// sync a to pfriend void sync(Probe &p,const Analyzer & a);//sync pto a...
}//define the friend functions
inline void sync(Analyzer & a,const Probe & p)
{
...
}
inline void sync(Probe &p,const Analyzer & a)
{
...
}
前向聲明使編譯器看到 Probe 類聲明中的友元聲明時,知道 Analyzer 是一種類型。