9

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

class Internal;

class CReference {
private:
    Internal data;
public:

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

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

4 回答 4

21

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

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

于 2013-05-31T12:36:51.737 回答
3

前向声明仅允许您使用指向它的指针和引用,直到完整声明可用

于 2013-05-31T12:36:32.337 回答
1

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

可以改用指针或引用,因为指针和引用的大小相同,无论它们引用什么类型。然后编译器只需要在您开始操作它时知道该类型的大小,因此在此之前您可以在没有完整声明的情况下逃脱。

于 2013-05-31T12:39:17.003 回答
0

正如刚才提到的。当仅在标头中使用类的普通指针时,前向声明用于避免头文件中的标头地狱。

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

于 2013-05-31T12:41:14.900 回答