2017-02-02 26 views
3

我曾经将我的测试类命名为待测试类中的朋友,以便启用测试专用字段。我注意到这个班的名字没有经过验证。这是故意吗?为什么“朋友班”没有被验证存在?

+3

*“我曾经为了测试私人领域而将我的测试班作为朋友在课堂上进行测试。”* - 这是一个可怕的想法。测试不能破坏封装。 –

+3

声明*创建*名称。他们不检查名称的存在。 –

+0

你能举一个你有什么样的例子,你认为哪一部分不应该工作? – NathanOliver

回答

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

这是故意吗?

我这么认为。这很像前向声明。

通常friend类需要友好类的完整声明,但反之亦然。


要强制检查的存在(声明)类型可以使用

class MyClass { 
    friend FriendClass; 
}; 

@bogdan's comment提及。


作为一个方面说明:
如何重构大多不恰当的朋友模式,我建议你阅读我的Q &一个帖子:How can I remove refactor a «friend» dependency declaration properly?

+3

你可以说'朋友X;'而不是'朋友类X',然后它需要先前的声明。也许这会帮助OP。 – bogdan

+0

@bogdan有趣的。我没有意识到这种语法的微妙之处。 –

+0

如果我正在阅读标准的权利(** [dcl.type.elab] **),这是因为声明工作由'class'完成,而'friend'只是一个修饰符。稍后在** [class.friend] **注释11中提到了一些关于我在我的脑海中进行的范围的警告。 – user4581301

0

想象一下,是否需要朋友类存在。你将如何构建你的代码?为了测试你的代码中有你的朋友声明。当你建立你的发货版本时,你不会发布测试代码,所以你必须删除好友声明并重建所有东西。现在您的代码与您测试的代码不同。

+0

查看bogdan和AnT的回复。否则我不会坚持朋友。在开发阶段,调试/发布解决方案也可以做。像断言。 – katang

相关问题