2013-05-31 50 views
7

我在使用铿锵声编译器的C++中发出前向声明的问题。这是我的代码。它将CReference成员中的数据指向为不完整类型。 请帮助向前在C++中声明类,不完整类型

class Internal; 

class CReference { 
private: 
    Internal data; 
public: 

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

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

你根本不能在这里使用前向声明。 'CReference'需要'Internal'的完整声明。 – juanchopanza

+0

如果你想转发声明,你应该使用一个指向'Internal'的指针。 – user1520427

+1

可能重复[何时使用前向声明?](http://stackoverflow.com/questions/553682/when-to-use-forward-declaration) – juanchopanza

回答

3

向前声明只允许您使用指针和引用它,额满为止声明可以

15

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

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

+0

几乎是一个完美的答案。剩下的就是提及他可以将“内部以上”的定义移到“CReference”上面,它将起作用。 –

+0

@RickYorgason - 当然,但我想OP知道,看起来很明显,因为'class Internal'不需要'了解'class CReference'。 –

1

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

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

0

如上所述。前向声明在头文件中仅使用一个类的普通指针时,可以避免使用头文件中的头文件。

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