繁体   English   中英

class 中的前向声明(不是嵌套类)

[英]Forward declaration within a class (not a nested class)

我遇到了这个奇怪的前向声明(或其他东西),而不是正常的:

class A;
class B{
    A* var;
}

你可以做

class B{
   class A* var;
}

现在这可能是一个详细的类型说明符,但我不确定。 我自己尝试过,没有遇到任何问题,甚至让我的代码更简洁,但我担心它可能会导致我目前不知道的范围问题。

有没有人对此有所了解? 这是有效的向前减速吗?

示例: https://youtu.be/EIptJ0YrYg0?t=412

请注意,文档说:

请注意,新的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM