簡體   English   中英

將函數指定為 Friend C++

[英]Designating functions as Friend C++

我正在查看以下文檔

https://en.cppreference.com/w/cpp/language/friend

第一個語法示例(朋友函數聲明)讓我感到困惑

它說:

  1. 指定一個 function 或幾個函數作為這個 class 的友元
    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訪問Ydata可能是合理的。 例如, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM