为什么“朋友班”没有经过验证?

时间:2017-02-02 17:22:27

标签: c++ friend

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

3 个答案:

答案 0 :(得分:2)

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

class C
{
  friend class X; // OK, introduces '::X'
};

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

class X {};

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

因此,如果您希望您的班级名称被验证为存在",请在朋友声明中使用限定名称。

答案 1 :(得分:1)

  

是故意吗?

我是这么认为的。这很像前瞻性宣言。

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

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

class MyClass {
    friend FriendClass;
};

@bogdan's comment中所述。

作为旁注:
如何重构大多数不合适的朋友模式,我建议你阅读我的Q& A帖子:How can I remove refactor a «friend» dependency declaration properly?

答案 2 :(得分:0)

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