如果我有一个班级名称应用程序和一个班级名称管理员。我想在内部经理类中创建一个app类,我看到了两个选项,但我不明白其中的区别。
选择1:
//.....
class app; //writing this line outside the declaration of the func
class manager{
//..
private:
app *a;
//...
}
或选择2:
class manager{
//..
private:
app *a;
//..
}
答案 0 :(得分:2)
答案 1 :(得分:1)
第一个示例包含类app
的前向声明,以便您可以在以后的代码中声明指向它的指针。在您尝试使用它之前,第二个示例根本没有提到app
,因此编译器不会接受它。编译器需要知道名称app
所指的内容,然后才能使用它来声明其他内容。
由于您只声明指针,因此您还不需要完整声明app
。但是为了让您的程序完全编译和链接,您最终需要定义 app
。可能在同一个文件中,也可能在其他文件中。但在尝试创建该类的实例或使用其任何成员变量和函数之前的某处。
答案 2 :(得分:1)
看,你的“选择2”是无效的C ++。谁知道你的想法...也许你想写这样的东西:
class manager {
//..
private:
class app *a;
//..
}
在这种情况下,我们定义指向app
类的指针,这里未知。这可以代替#include "app.h"
使用,因为所有指针都具有相同的大小,您可以定义指针而不定义app
类。您的第一个示例执行相同的操作,但允许您在指向它的所有后续定义中省略class
个字。
答案 3 :(得分:1)
class app;
之外的class manager { ... }
是前向声明。它告诉编译器,“app
是一个类。我不会告诉你它的样子,但相信我,它是。”
将编译器视为仅在编译时了解此特定文件(我假设它是.h
文件)。您已经说过,member
类包含指向“app
”的指针。 “什么是 app ?”编译器想知道。没有前向声明(或者可能是#include app.h
或类似的东西),它不知道,并且将无法编译。通过在顶部class app;
说,它知道app
是一个类。这就是在member
类中为指针分配空间所需要知道的全部内容。