繁体   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