這個問題,我困擾了好一會,決定記錄一下。
問題**簡化如下:
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 類機制實現了資料的隱藏與封裝,類的資料成員一般定義為私有成員,成員函式一般定義為公有的。有時需要定義一些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員,這時可以將這些函式定義為該類的友元函式。除了友元函式外,還有友元類,兩者統稱為友元。友元的作用是提高了程式的執行效率 即減少了型別...