gpt4 book ai didi

c++ - 在为嵌套类定义异常 friend 时,我真的必须打破封装吗?

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:00 24 4
gpt4 key购买 nike

考虑这样的例子:

class A
{
class B {
friend void f1(const B&){};
friend void f2(const B&);
};
// friend void f2(const B&); // has to be repeated =[
};

void f2(const A::B&){}

除了内联定义函数之外,还有其他方法可以避免友元重复吗?

我感到惊讶的是,要从一个类中提取定义需要重复自己,将嵌套类的详细信息泄露给外部类,恕我直言,最重要的是允许访问 A不相关的函数私有(private)。

friendess 的一般规则是它不可传递,但在这里我基本上被迫打破它以进行外线定义,我发现它很难权衡。

这背后有技术原因吗?我想这个论点可能是越线需要私有(private)信息 A包含 B ,虽然我不确定就是这样。与缺点相比似乎没有说服力。

注意:我对重组类层次结构来避免这个问题不感兴趣。这个问题不纯粹是学术性的;我有过operator<<(ostream&, const B&)并希望将定义移出 header 。

最佳答案

C++ 中的可访问性以从给定范围访问名称的能力为中心。 A::B 命名了 A 的私有(private)成员。这意味着声明/定义既不是 A 的成员也不是 A 的直接 friend ,不允许使用名称 A::B直接。

f2 在其声明中使用名称 A::B。如果该声明出现在 A::B 的范围之外,则它必须是 A 的成员或 A 的直接友元.

这就是无障碍功能在 C++ 中的工作原理。您遇到的只是这些规则如何发挥作用的必然结果。

您感到困惑的是内联 friend 定义规则的古怪结果。是他们制定了意想不到的规则;或者更确切地说,与明显规则的意外互动。这些 friend 声明位于 A::B 已经可访问的范围内,因此它们可以随意使用该名称。由于您可以就地为此类函数提供定义,因此无需使 A::B 对该定义可见。

理论上是否可以更改可访问性规则,以便自动使 friended 函数的外部定义工作就好像它们是在类中定义的 friend 教育他们?那将是一件非常奇怪的事情,因为一个函数可以是多个类的 friend 。那么它会“像”在哪个类中定义它一样工作?

关于c++ - 在为嵌套类定义异常 friend 时,我真的必须打破封装吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52629870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com