[英]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.