关于c ++:为什么没有验证存在的“朋友类”?

Why is a “friend class” not verified for existence?

我曾经将我的测试类命名为要测试的类中的朋友,以便能够测试私有字段。 我注意到该类的名称未经验证存在。 是故意吗?


使用具有类的非限定名称的详细类型说明符的友元类声明实际上是该类的声明。它将类作为封闭命名空间的成员引入。它不需要预先声明它

1
2
3
4
class C
{
  friend class X; // OK, introduces '::X'
};

但是,如果您在友元类声明中使用限定名称,则它将受到常规限定名称查找。它必须引用先前声明的名称

1
2
3
4
5
6
7
class X {};

class C
{
  friend ::X; // OK, refers to '::X'
  friend ::Y; // Error, no '::Y' in sight
};

因此,如果您希望您的类名称"已验证存在",请在好友声明中使用限定名称。


Is it by intention?

我认同。这很像一个前瞻宣言。

通常friend类需要对friended类进行完整声明,但反之则不然。

要强制检查现有(声明)类型,您可以使用

1
2
3
class MyClass {
    friend FriendClass;
};

正如@ bogdan的评论中提到的那样。

作为旁注:
如何重构大多不合适的朋友模式,我建议你阅读我的问答帖子:如何删除重构朋友?依赖声明适当吗?


想象一下,如果要求朋友类存在。你将如何构建代码?为了测试,您在代码中拥有该朋友声明。在构建发布版本时,您不会发送测试代码,因此您必须删除好友声明并重建所有内容。现在您要发送的代码与您测试的代码不同。