2012-08-17 87 views
0

嗨我無法建立一個頭文件我需要它的方式。爲了簡化這裏,我的問題是一個例子:無法訪問類++

#ifndef MYHEADER_H 
#define MYHEADER_H  

class Parent 
{ 
    Child mykid; //a kid of mine 
    void dosomething(void); 
}; 

class Child 
{ 
     Parent * mydad; //pointer back to my dad 
     void dosomething(void); 
};  

#endif // MYHEADER_H 

我basicly需要使用另一個類裏面一類的編譯器甚至知道它之前。在我定義內部之前,有沒有辦法告訴編譯器我的類?

回答

5

此:

class Parent; 
class Child 
{ 
     Parent * mydad; //pointer back to my dad 
     void dosomething(void); 
};  
class Parent 
{ 
    Child mykid; //a kid of mine 
    void dosomething(void); 
}; 

建議:移動它們在不同的標題,在Parent.h前瞻性聲明中Child.hParent#include "Child.h"

Parent需要完整定義Child才能工作,Child只需要聲明。

我也建議你停止使用原始指針。

+0

由於這將有望爲我所需要的工作,並感謝您的諮詢! – luveti 2012-08-17 17:22:48

0

肯定的:

class Parent; 

class Child { Parent * dad; }; 
class Parent { Child kid; }; 

要定義一個類,所有的類成員必須有一個完整的class Parent;使得Parent一個不完全類型。然而,對於任何T類型,是否完全或不完全,T *總是一個完整的類型。

0
class Parent; 

class Child 
{ 
     Parent * mydad; // it's enough to know class exists 
     void dosomething(void); 
}; 

class Parent 
{ 
    Child mykid; // We must know size of a class 
    void dosomething(void); 
}; 
0

Parent包含Child對象,所以它的定義必須來到的Child後定義;這是需要完整定義的類型之一。

Child只包含指向Parent的指針,因此它只需要Parent類型的聲明。

因此,你需要:

// Declaration 
class Parent; 

// Definitions 
class Child 
{ 
    Parent * mydad; // type can be incomplete 
    void dosomething(void); 
}; 
class Parent 
{ 
    Child mykid; // type must be complete 
    void dosomething(void); 
}; 

當一個類型已聲明,但沒有定義,這就是所謂的不全。你可以用不完整的類型做各種事情,包括聲明指針和引用它,並將它用作函數聲明中的參數或返回類型。您不能創建類型的對象(這包括聲明類型的非靜態類成員),因爲需要的定義,以瞭解各種情況,例如它的大小。