乙個友元類使用誤區(C )

2021-07-25 07:01:58 字數 1640 閱讀 9271

這個問題,我困擾了好一會,決定記錄一下。

問題**簡化如下:

class b;

class a

;

編譯出錯提示資訊:

'bool a::operator()(int, int)' is private

你知道問題出現在**嗎??如果你看出來了,那麼恭喜你,我是花了挺長時間糾結的。

我的理解是這樣的。 類a有乙個刪除的預設建構函式,類的使用者是沒有許可權新建例項的,主要是為了封裝資料。我一開始以為,b是a的友元類,理論上在b的作用域中可以建立a的物件,訪問a的私有介面。 這樣想確實沒有錯誤,問題出現在我是在類b的成員std::priority_queue中使用類a。 友元不具有傳遞性和繼承性,只能在b類的作用域中可以使用,相當於在b的成員函式中使用。但是std::priority_queue中的成員不具備訪問類a的許可權。除非將std::priority_queue宣告為類a的友元類。因此定義如下函式便報錯。

add_item(int times)
因為在pq的成員中使用了類a的成員函式, 每次向pq插入乙個元素便會呼叫這個類a這個成員,如下

bool operator()(int lhs,int rhs)

private:

auto less = (int& lhs,int rhs)->bool ;

這也是行不通的,類在編譯的時候只看宣告,auto需要根據給出的lambda 表示式推斷出對應的型別,因此成員less出錯,當然pq宣告也就出錯了。

3、接下來就開始思考如何應對這個問題。檢視std::priority_queue的constructor. 自定義乙個函式比較器型別。

explicit priority_queue( const compare& compare = compare(),

const container& cont = container() );(until c++11)

priority_queue( const compare& compare, const container& cont );(since c++11)

//...省略

**如下: 使用簡單函式指標作為型別。新建乙個物件需要提供這個函式指標型別的乙個例項。

#include #include#include#include#includeclass b

private:

std::priority_queue,auto(*)(const int& ,const int&)->bool >

pq};

};

在c++11。 可以使用標準庫提供的函式型別(std::function)

class b

private:

std::priority_queue,std::function>

pq};

};

這個只是記錄,從遇到問題到最後解決。實現了自己想到的結果。這當中難免有錯誤,歡迎指出來, 有好的想法歡迎提出來。

C 友元函式 友元類

友元函式和友元類 採用類的機制後實現了資料的隱藏與封裝,類的資料成員一般定義為私有成員,成員函式一般定義為公有的,依此提供類與外界間的通訊介面。但是,有時需要定義一些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員,這時可以將這些函式定義為該函式的友元函式。除了友元函式外,還有友元類,兩...

C 友元函式 友元類

友元函式和友元類 採用類的機制後實現了資料的隱藏與封裝,類的資料成員一般定義為私有成員,成員函式一般定義為公有的,依此提供類與外界間的通訊介面。但是,有時需要定義一些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員,這時可以將這些函式定義為該函式的友元函式。除了友元函式外,還有友元類,兩...

c 友元類 友元函式

c 類機制實現了資料的隱藏與封裝,類的資料成員一般定義為私有成員,成員函式一般定義為公有的。有時需要定義一些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員,這時可以將這些函式定義為該類的友元函式。除了友元函式外,還有友元類,兩者統稱為友元。友元的作用是提高了程式的執行效率 即減少了型別...