在C++中的类前置声明,不完全类型

10
我在使用clang编译器时遇到了C++中前向声明的问题。以下是我的代码,它将CReference成员的数据指向不完整类型。 请帮忙解决。
class Internal;

class CReference {
private:
    Internal data;
public:

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

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

你不能在这里使用前向声明。CReference需要Internal的完整声明。 - juanchopanza
如果您想前向声明 Internal,则应使用指针。 - user1520427
1
可能是何时使用前向声明?的重复问题。 - juanchopanza
4个回答

22

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

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


几乎是一个完美的答案。唯一剩下的就是提到他可以将Internal的定义移到CReference上面,这样它就能工作了。 - Rick Yorgason
@RickYorgason - 当然,但我猜原帖的作者也知道这一点,因为class Internal不需要“知道”class CReference - Kiril Kirov

3

仅有前置声明只允许您使用指向它的指针和引用,直到完整声明可用为止。


1
为了将类型用作类的成员,编译器必须知道它的大小,以便正确计算类的大小。前向声明不提供该信息(C ++不会向前查找并尝试查找它,特别是因为该主体可能在另一个翻译单元中声明),因此您不能将其用作按值成员。
您可以使用指针或引用,因为指针和引用不管它们所引用的类型是什么,它们的大小都相同。然后,一旦开始操作它,编译器只需要知道该类型的大小,因此您可以在那时之前没有完整的声明而逃脱。

0
如上所述,前向声明在头文件中使用类的普通指针时可以避免头文件混乱的问题。
通常情况下,您希望尽可能减少头文件中的包含数量。通过前向声明一个类来实现这一点,但仅当它不是嵌套类并且仅在头文件中使用指针时才能这样做,因为此时指针大小是所需的信息,而前向声明提供了该信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接