为什么没有验证 "friend class" 是否存在?
Why is a "friend class" not verified for existence?
我曾经在class中将我的测试命名为class作为朋友进行测试,以启用测试私有字段。我注意到 class 的名称未被验证是否存在。是故意的吗?
Is it by intention?
我也这么认为。这很像一个前向声明。
通常 friend
class 需要好友 class 的完整声明,但反之则不然。
要强制检查存在的(已声明的)类型,您可以使用
class MyClass {
friend FriendClass;
};
如所述。
作为旁注:
如何重构最不合适的好友模式,推荐你看我的问答post:How can I remove refactor a «friend» dependency declaration properly?
朋友 class 声明使用详细类型说明符 non-qualified class 的名称实际上是 [=18= class 的声明。它 引入 class 作为封闭命名空间的成员。它不需要 pre-declared
class C
{
friend class X; // OK, introduces '::X'
};
但是如果您在朋友 class 声明中使用 合格的 名称,它将受到定期的合格名称查找。并且它必须引用先前声明的名称
class X {};
class C
{
friend ::X; // OK, refers to '::X'
friend ::Y; // Error, no '::Y' in sight
};
因此,如果您希望 class 名称为 "verified for existence",请在朋友声明中使用限定名称。
想象一下,如果朋友 class 必须存在。你将如何构建你的代码?为了进行测试,您的代码中有该朋友声明。当您构建发布版本时,您不会发布测试代码,因此您必须删除友元声明并重新构建所有内容。现在您发布的代码与您测试的代码不同。
我曾经在class中将我的测试命名为class作为朋友进行测试,以启用测试私有字段。我注意到 class 的名称未被验证是否存在。是故意的吗?
Is it by intention?
我也这么认为。这很像一个前向声明。
通常 friend
class 需要好友 class 的完整声明,但反之则不然。
要强制检查存在的(已声明的)类型,您可以使用
class MyClass {
friend FriendClass;
};
如
作为旁注:
如何重构最不合适的好友模式,推荐你看我的问答post:How can I remove refactor a «friend» dependency declaration properly?
朋友 class 声明使用详细类型说明符 non-qualified class 的名称实际上是 [=18= class 的声明。它 引入 class 作为封闭命名空间的成员。它不需要 pre-declared
class C
{
friend class X; // OK, introduces '::X'
};
但是如果您在朋友 class 声明中使用 合格的 名称,它将受到定期的合格名称查找。并且它必须引用先前声明的名称
class X {};
class C
{
friend ::X; // OK, refers to '::X'
friend ::Y; // Error, no '::Y' in sight
};
因此,如果您希望 class 名称为 "verified for existence",请在朋友声明中使用限定名称。
想象一下,如果朋友 class 必须存在。你将如何构建你的代码?为了进行测试,您的代码中有该朋友声明。当您构建发布版本时,您不会发布测试代码,因此您必须删除友元声明并重新构建所有内容。现在您发布的代码与您测试的代码不同。