1. 程式人生 > >友元在類中的使用

友元在類中的使用

實現 而是 pub 友元類 調用 訪問 define .... 很多

友元在類中的使用一般分為兩種:
(1) 友元類
(2) 友元函數

關於友元類:
友元類的使用和聲明極為簡單,只需在需要訪問的類中加上friend class Classname 即可 。這樣被聲明的友元類即可訪問聲明處的類的所有成員,
同時聲明的位置不限只需要在類中即可。

//     Tv 是一個類,而Remote則是Tv的遙控器,很顯然Remote需要使用Tv
//     中的數據進行操作,此時可聲明為友元類。
#ifndef TV_H_
#define TV_H_

class Tv{
private:
                int state ;
                int volume ;
                int maxchannel ;
                int channel ;
                int mode ;
                int input ;
    public:
                class friend Remote ;  
                // 聲明友元類 ,Remote類可以直接訪問Tv類的成員
                //   在類中任何地方聲明皆可
                statements ;
};

關於友元函數:
實際上在大多數情況下,類中的數據交互只在幾個函數間,太多的數據交互反而增加了錯誤的可能;所以在只有少量的數據交互時,不需要聲明友元類,使用友元函數就可以了。
(1) 友元函數作為類的成員
還是以之前的Tv與Remote為例:
如果說很多關於Tv本身的操作都被封裝成了函數,外部的Remote類只需要
調用其函數就可以改變Tv的狀態,且只有少部分數據需要同外界的類直接
交互。那麽,這時最好的方式就是使用為類成員的友元函數。

    class Tv
    {
        private:
                int state ;
                int volume ;
                int maxchannel ;
                int channel ;
                int mode ;
                int input ;
        public:
                friend void Remote::set_channel(Tv & tv , int c) ;
                //       聲明友元函數,這個函數是Remote類的成員
                //       在聲明後Remote類可以直接通過set_channel函數進行操作
                //       而不需要使用友元類
                statements of funcs in the Tv class ;
        }

但註意這裏會遇到一個聲明順序的問題!
由於在tv類中有著remote類的一個具體實現的函數聲明,故而關於
remote類的聲明需要放在tv類的前面!同時tv類需要預聲明:

            class Tv ;
            class Remote { ...... } ;
            class Tv{ ...... } ;

(2) 友元函數作為普通函數
在部分情況下,數據間的共享或者同步,不是發生在類間的,
而是通過使用外部的函數進行。那麽則是需要使用,普通函數作為
友元函數。
在需要同步或共享的類的類中聲明普通函數的友元,在普通函數實現
數據的同步與共享,猶如一個第三方的接口。

友元在類中的使用