原始问题可以在下面找到。
因此,我们发现以下内容并不起作用:
void f(){
g();
}
void g(){}
但是,确实在课堂上工作,这就是我困惑的地方:
class test{
int getY(){
return getX();
}
int getX(){
return 10;
}
}
在MSVC10.0下编译完全正常。
因此,在重新措辞之后,问题是:
为什么我不需要在类中进行前向声明?
在C ++中,声明函数或变量的顺序根本不重要。调用尚未声明的函数没有任何问题。这同样适用于变量:
但是,它不适用于课程。如果我想使用稍后在源文件中定义的类,我必须转发声明它。
为什么?什么阻止编译器知道所有类声明?
答案 0 :(得分:6)
在C ++中,声明函数或变量的顺序 没关系。调用函数没有错 尚未宣布。这同样适用于变量。
......那根本不是真的吗?你需要在使用之前声明函数和变量,否则编译器会对你不满意。
编辑为了回应编辑,您展示的是一个非常特殊的情况,其中涉及的所有内容都是内部的。在这种特殊情况下,您可以使用未声明的变量和函数名称。您可以这样做的唯一原因是编译器将类定义视为一个单元,并在编译之前读取所有类。但是,一般来说,你必须转发声明一切。
答案 1 :(得分:2)
通常,每个名称必须在使用前声明,无论它们是类,函数,变量还是其他名称。
但是,有一个特殊情况:在(大多数)类定义中,您可以使用该类成员的名称,即使它们尚未声明。您添加的示例演示了这一点,并且如果未声明的名称属于类,变量或其他任何名称,它仍然有效,只要它是test
的成员。
答案 2 :(得分:0)
类的前向声明类似于指定函数原型。
通过这种方式,您可以指定类名而不提及其类似于函数原型的内容,您可以在指定函数签名之前指定函数签名以声明其作用域。 定义可以在某段代码之后完成。
是的,有一个例外,即成员包括在类或结构中。这些成员具有相同的范围。