[英]Forward declaration within a class (not a nested class)
我遇到了这个奇怪的前向声明(或其他东西),而不是正常的:
class A;
class B{
A* var;
}
你可以做
class B{
class A* var;
}
现在这可能是一个详细的类型说明符,但我不确定。 我自己尝试过,没有遇到任何问题,甚至让我的代码更简洁,但我担心它可能会导致我目前不知道的范围问题。
有没有人对此有所了解? 这是有效的向前减速吗?
请注意,文档说:
请注意,新的 class 名称也可能由作为另一个声明的一部分出现的详细类型说明符引入,但前提是名称查找无法找到先前声明的具有相同名称的 class。
因此,如果 class B
包含在命名空间中并且之前没有执行A
的前向声明,则它引用必须定义的n2::A
。
现在这可能是一个详细的类型说明符,但我不确定。
这是。 事实上, class A;
是使用精心设计的 class 说明符的声明。
但恐怕这可能会导致我目前不知道的范围界定问题
您应该注意的唯一与作用域相关的点是,如果详细类型说明符(本身不是声明)是第一次引用 class,则其行为与将前向声明引入到最近的命名空间相同或阻止 scope。例如
namespace N {
class foo {
class bar {
void func(class baz*);
};
};
};
... 是相同的
namespace N {
class baz;
class foo {
class bar {
void func(baz*);
};
};
};
是的,这是一个有效的前向声明。 它被称为精心设计的类型说明符。
引用来自 cppreference 的详细类型说明符。
如果名称查找未找到先前声明的类型名称,则 elaborated-type-specifier 由 class、struct 或 union(即不是由 enum)引入,并且 class-name 是不合格的标识符,则 elaborated-type-说明符是类名的 class 声明。
它也可以用来引用一个已经声明的 class,即使它的名字被非类型声明隐藏了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.