我使用clang编译器在C ++中使用Forward声明存在问题。这是我的代码。它将CReference成员中的数据指向为不完整类型。 请帮忙
class Internal;
class CReference {
private:
Internal data;
public:
CReference () {}
~CReference (){}
};
class Internal {
public:
Internal () {}
~Internal () {}
};
答案 0 :(得分:17)
当编译器不需要类型的完整定义时,前向声明很有用。换句话说,如果您将Internal data;
更改为Internal* data
或Internal& data
,则会有效。
使用Internal data;
,编译器需要知道Internal
的整个定义,才能创建CReference
类的结构。
答案 1 :(得分:3)
前向声明只允许您使用指针和引用,直到完全声明可用
答案 2 :(得分:1)
要将类型用作类的成员,编译器必须知道它有多大,以便可以正确计算类的大小。前瞻性声明并未提供该信息(C ++不会向前看并试图找到它,特别是因为正文可能在另一个翻译单元中声明),因此您无法将其用作按价值成员。
你可以使用指针或引用,因为指针和引用的大小相同,无论它们引用何种类型。然后,一旦你开始操作它,编译器只需要知道该类型的大小,因此你可以在没有完整声明的情况下离开。
答案 3 :(得分:0)
如上所述。当在标题中仅使用类的普通指针时,前向声明可用于避免头文件中的标题地狱。
您通常希望尽可能少地保留包含在头文件中。 这可以通过向前声明一个类来实现,但前提是它不是嵌套类,并且只有在头中使用指针时,指针大小才是必需的信息,由前向转换提供。