用C ++转发类声明,不完整类型

时间:2013-05-31 12:35:05

标签: c++

我使用clang编译器在C ++中使用Forward声明存在问题。这是我的代码。它将CReference成员中的数据指向为不完整类型。 请帮忙

class Internal;

class CReference {
private:
    Internal data;
public:

    CReference () {}    
    ~CReference (){}
};

class Internal {
public:
    Internal () {}
    ~Internal () {}
};

4 个答案:

答案 0 :(得分:17)

当编译器不需要类型的完整定义时,前向声明很有用。换句话说,如果您将Internal data;更改为Internal* dataInternal& data,则会有效。

使用Internal data;,编译器需要知道Internal的整个定义,才能创建CReference类的结构。

答案 1 :(得分:3)

前向声明只允许您使用指针和引用,直到完全声明可用

答案 2 :(得分:1)

要将类型用作类的成员,编译器必须知道它有多大,以便可以正确计算类的大小。前瞻性声明并未提供该信息(C ++不会向前看并试图找到它,特别是因为正文可能在另一个翻译单元中声明),因此您无法将其用作按价值成员。

可以使用指针或引用,因为指针和引用的大小相同,无论它们引用何种类型。然后,一旦你开始操作它,编译器只需要知道该类型的大小,因此你可以在没有完整声明的情况下离开。

答案 3 :(得分:0)

如上所述。当在标题中仅使用类的普通指针时,前向声明可用于避免头文件中的标题地狱。

您通常希望尽可能少地保留包含在头文件中。 这可以通过向前声明一个类来实现,但前提是它不是嵌套类,并且只有在头中使用指针时,指针大小才是必需的信息,由前向转换提供。