[英]Designating functions as Friend C++
我正在查看以下文檔
https://en.cppreference.com/w/cpp/language/friend
第一個語法示例(朋友函數聲明)讓我感到困惑
它說:
class Y
{
int data; // private member
// the non-member function operator<< will have access to Y's private members
friend std::ostream& operator<<(std::ostream& out, const Y& o);
friend char* X::foo(int); // members of other classes can be friends too
friend X::X(char), X::~X(); // constructors and destructors can be friends
};
// friend declaration does not declare a member function
// this operator<< still needs to be defined, as a non-member
std::ostream& operator<<(std::ostream& out, const Y& y)
{
return out << y.data; // can access private member Y::data
}
我的困惑來自以下代碼行friend char* X::foo(int); // members of other classes can be friends too
friend char* X::foo(int); // members of other classes can be friends too
。 我不知道為什么我們要聲明這樣一個 function,因為我看不出給另一個 class 的成員 function 建立友誼有任何用處(在這種情況下為 class X
),因為我們沒有傳遞class Y
參考 884028998一個參數,因此我們無法通過foo
function 真正訪問Y
的私有成員。
這個例子是否有用?
首先,我想指出並非 C++ 標准允許的所有內容都一定有用。 有時某些事情是允許的,因為它們不會造成傷害,而禁止它們會使標准變得更加復雜。 在這些情況下,標准傾向於簡化,這意味着寬容。
有時,這種寬容本身就是有用的,因為最終有人會發現看似無用的允許事物的用途。 因此,詢問有用性可能會很有成效。 像這樣的問題對增長知識是有好處的,只要不要太掛在這些問題上。 有時示例只是可能的示例,而不是(已知)有用的示例。
現在開始手頭的案例。
假設X
有一個Y
類型的成員。 讓X
訪問Y
的data
可能是合理的。 例如, X
的定義可能如下所示。 (使用unique_ptr
是為了避免循環依賴問題X
的定義需要在Y
的定義之前發生。)
class Y; // Forward declaration
class X
{
std::unique_ptr<Y> token;
public:
X(char);
~X();
char* foo(int);
Y getToken();
void giveToken(Y);
};
在此設置中,通過友誼,構造函數將能夠將token->data
設置為所需的任何值, foo()
將能夠更改該值,並且析構函數可以讀取該值。
雖然這給出了friend
元聲明的原因,但到目前為止用私有嵌套 class 替換Y
也可以。 這就是我添加 getToken( getToken()
和giveToken()
成員的原因。 我可以看到這個 class 贈送*token
的副本供消費者持有。 將此視為拍攝快照。 由於消費者不是Y
的朋友,令牌對他們來說實際上是不可變的。 他們可以復制、移動、丟棄它,但不能修改它。 (如果Y
構造函數設為私有,消費者也將無法創建新令牌。)
稍后,可以將令牌提供給 object——不一定是相同的 object,也不一定是X
object——可能會將其內部 state 重置為快照。 (如果可以通過*pimpl = y;
完成,則無需友誼即可完成。)如果有多個類可以處理這些標記,則有理由使Y
成為獨立的 class 而不是嵌套的 class。
我不認為這是一個好的設計,但它是一個有效的設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.