【问题标题】:Why do I not have to forward declare functions or variables inside classes?为什么我不必在类中转发声明函数或变量?
【发布时间】:2014-06-09 14:51:23
【问题描述】:

原始问题可以在下面找到。

所以,我们发现以下方法不起作用:

void f(){
    g();
}
void g(){}

但是,它确实在类中工作,这就是我感到困惑的地方:

class test{
   int getY(){
       return getX();
   }
   int getX(){
       return 10;
   }
}

这在 MSVC10.0 下编译得非常好。

Ideone link. It does work.

所以,改写之后,问题是:

为什么我不需要在类中进行前向声明?

原问题,请忽略

在 C++ 中,函数或变量的声明顺序根本不重要。调用尚未声明的函数并没有错。这同样适用于变量:

但是,它不适用于课程。如果我想使用稍后在源文件中定义的类,我必须转发声明它。

为什么?是什么阻止了编译器知道所有的类声明?

【问题讨论】:

  • "调用尚未声明的函数没有任何问题。"我想你可能想仔细检查那个。 ;)
  • @iFreilicht:如果您在void f() 上方有声明void g();,那么可以。但是你需要先声明它。
  • @iFreilicht 您的更新显示了一个特殊情况,使问题变得有趣。来自我的 +1。
  • 声明一个包含所有成员的类是一个语句(因此您忘记了结束分号)。无论成员出现的顺序如何,整个声明都在其自身范围内。
  • 更进一步的“在同一个完整声明中”的想法,类似int a = a;,虽然荒谬,但不会产生“未声明的标识符”错误:ideone.com/6BazZS

标签: c++ function class variables c++11


【解决方案1】:

在 C++ 中,函数或变量的声明顺序 一点都不重要。调用函数并没有错 尚未宣布。这同样适用于变量。

...这根本不是真的?函数和变量在使用前需要先声明,否则编译器不会对你特别满意。

编辑 作为对编辑的回应,您所展示的是一种非常特殊的情况,其中涉及的所有内容都是类内部的。在这种特殊情况下,您可以使用未声明的变量和函数名称。您可以这样做的唯一原因是编译器将类定义视为一个单元,并在编译之前通读所有单元。但是,一般来说,您必须转发声明所有内容。

【讨论】:

  • ...很高兴你;p +1
  • 啊,这就是我所缺少的。感谢您的编辑,我现在知道了。
  • 请注意,在他的特殊情况下,函数并没有什么特别之处。 变量也可以先使用(在成员函数的主体中),然后在同一个类声明中声明。
【解决方案2】:

一般来说,每个名称都必须在使用前声明,无论它们是类、函数、变量还是其他名称。

但是,有一种特殊情况:在(大部分)类定义中,您可以使用该类成员的名称,即使它们尚未声明。您添加的示例演示了这一点,如果未声明的名称是类、变量或其他任何名称,只要它是 test 的成员,它仍然可以工作。

【讨论】:

    【解决方案3】:

    类的前向声明类似于指定函数的原型。

    通过这种方式,您可以指定类名,而无需当前提及其内容,类似于函数原型,您可以在指定其定义之前指定函数签名以声明其范围。 定义可以在一段代码之后完成。

    是的,对此有一个例外,即包含在类或结构中的成员。这些成员具有相同的范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-31
      • 2012-11-23
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多