關於類的友元函式實現解析

2021-05-01 21:54:01 字數 1923 閱讀 1303

程式設計時碰到這個問題,現在把這個問題搞清楚,和大家分享一下~

如果想設定友元函式的話,那麼在這個過程中就必須先定義型別,然後再定義實現的細節。如果在這個過程中友元函式。在類中定義友元的時候必須前項宣告。但是宣告之後的類在引用的過程中不能涉及到類的具體細節,因為在宣告的過程中本生就沒有涉及到細節(即類的變數和方法),從編譯器的角度來說的話就是編譯器現看到宣告,知道這是乙個類,如果要用到類中的變數必須在類定義之後才能使用。下面舉個例子:

現定義兩個類:

class screen

friend window_mgr::reset(screen&,int x,int y);

private:

int height;

int width;

};class window_mgr

void reset(screen&,int x,int y);

private:

int height;

int width;

};如果此時我們就將這兩個類放在檔案裡,那是行不通的,因為無論那個類放在前面,它都不能完成編譯。class screen放在前面,當編譯器編譯到friend的時候,它在查詢window_mgr。此時沒有宣告window_mgr是什麼。所以此編譯器出錯,再者,將window_mgr放在前面也是同樣的道理。因此我們首先要現宣告下乙個類。那麼究竟那個類放在前面用作宣告呢?

我們現在還不清楚,那麼假定screen放在前面宣告;

class screen;

後面緊跟的應該是window_mgr,因為如果不是window_mgr那麼宣告也沒有意義。

class window_mgr;

class screen

friend window_mgr::reset(screen&,int x,int y);

private:

int height;

int width;

};那麼自然後面就跟這window_mgr

表面看起來似乎差不多,但是細究下scren的**

friend void window_mgr::reset(screen&,int x,int y)

因為前面只是宣告了window_mgr是乙個類,對於類裡面的細節我們還不清楚。所以我們不能對乙個不清楚裡面內容的類進行操作。所以我們應該將screen類放在前面宣告,後面進緊跟著window_mgr;

如下:class screen;

class window_mgr

void reset(screen&,int x,int y);

private:

int height;

int width;

};class screen

friend window_mgr::reset(screen&,int x,int y);

private:

int height;

int width;

};值得注意是宣告類的時候,我們不能去使用該宣告類中的細節,因為編譯器無法知道你宣告的類中是什麼內容。只有當編譯器編譯到該類的時候才知道類中是什麼~

我們拓展一下:

如果此時在class window_mgr中還包含了reset方法的實現的話:

例如:class window_mgr

void reset(screen& myscreen,int x,int y)

{myscreen.height+=x;

myscreen.width+=y;

}private:

int height;

int width;

};那麼上面的的程式又出錯了,為什麼呢?

因為我們在window_mgr定義的時候只是宣告了screen,並沒有說明screen中還存在這height和width。

因此上述函式的實現不能在類中進行而是應該放到screen類後面來實現。可以放在實現檔案cpp中實現。

友元(友元函式 友元類 類成員函式的友元)

friend 友元機制 允許乙個類將對其非公有成員的訪問許可權授予指定的函式或者類。我們可以將友元大致分為3類 友元函式 是指某些雖然不是類的成員函式,但是能夠訪問這個類的所有成員的函式。比如我們下列的 include class test friend void show test rhs 宣告 ...

類 友元函式 友元類

友元函式不是當前類的成員函式,但它可以訪問該類所有的成員,包括私有成員 保護成員和公有成員。在類中宣告友元函式時,需在其函式名前加上關鍵字 friend。友元函式既可以是非成員函式,也可以是另乙個類的成員函式。class date date date int y,int m,int d void s...

友元函式 友元類

friend class 1 友元函式 2 友元類 友元函式與友元類。c 中以關鍵字friend宣告友元關係。友元可以訪問與其有friend關係的 類中的私有成員。友元包括友元函式和友元類。1 友元函式 如果在本類以外的其它地方定義了乙個函式 這個函式可以是不屬於任何類的非成員函式,也可以是其它類的...