理解c ++中的对象创建

时间:2011-01-25 20:21:43

标签: c++ class

如果我有一个班级名称应用程序和一个班级名称管理员。我想在内部经理类中创建一个app类,我看到了两个选项,但我不明白其中的区别。

选择1:

//.....
class app;  //writing this line outside the declaration of the func
class manager{
//..   
private:
 app *a;
//...
}

或选择2:

class manager{
//.. 
private:
app *a;
//..
}

4 个答案:

答案 0 :(得分:2)

我认为你在谈论前瞻性声明。如果是这样,那么请阅读:

C++ INCLUDE Rule : Use forward declaration when possible

另请阅读此常见问题:

[39.12] What special considerations are needed when forward declarations are used with member objects?

答案 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类中为指针分配空间所需要知道的全部内容。