Why is a “friend class” not verified for existence?
我曾经将我的测试类命名为要测试的类中的朋友,以便能够测试私有字段。 我注意到该类的名称未经验证存在。 是故意吗?
-
"我曾经将我的测试类命名为要测试的类中的朋友,以便能够测试私有字段。" - 这是一个可怕的想法。测试不得破坏封装。
-
声明创建名称。他们不检查姓名的存在。
-
你能举例说明你拥有什么,你认为哪些部分不起作用?
-
@ChristianHackl相关stackoverflow.com/questions/4171310/&
-
@ChristianHackl:有黑盒测试,然后有白盒测试。白盒测试确实破坏了封装。
-
@ChristianHackl黑盒测试:飞行飞机,看它是否崩溃。白盒测试:将飞机拆开,检查关键部件是否有发丝裂缝,然后将飞机重新组合在一起。飞机定期进行白盒测试。
-
@KlitosKyriacou:那么friend单元测试就像是让测试人员每次都和乘客一起在飞机上飞行?将计算机程序与现实生活中的东西进行比较只有很多价值,你知道......
-
@Christian Hackl我正在实现的过程中,在实现一些新的细节后,我测试它,而不是踩踏和调试。没有为现成的项目进行测试。我觉得它不太可怕,但我想知道你提供的/首选方法是什么。
使用具有类的非限定名称的详细类型说明符的友元类声明实际上是该类的声明。它将类作为封闭命名空间的成员引入。它不需要预先声明它
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的评论中提到的那样。
作为旁注:
如何重构大多不合适的朋友模式,我建议你阅读我的问答帖子:如何删除重构朋友?依赖声明适当吗?
子>
-
您可以说friend X;而不是friend class X;,然后它将需要先前的声明。 也许这会对OP有所帮助。
-
@bogdan有趣。 我没有意识到这种语法的微妙之处。
-
如果我正在阅读标准权利([dcl.type.elab]),那是因为声明工作是由class完成的,而friend只是一个修饰符。 稍后在[class.friend]注释11中有一些关于我在脑海中工作的范围的警告。
想象一下,如果要求朋友类存在。你将如何构建代码?为了测试,您在代码中拥有该朋友声明。在构建发布版本时,您不会发送测试代码,因此您必须删除好友声明并重建所有内容。现在您要发送的代码与您测试的代码不同。
-
请参阅bogdan和AnT的回复。 否则我不会坚持朋友。 在开发阶段,调试/发布解决方案也可以。 像断言一样。