2012-10-12 57 views
0

可能重複:
Circular Dependency with forward declaration error提前定義

我有兩個文件,一個定義結構(這裏:端口),另一種是定義一個類(這裏:設備)。由於類使用這些結構作爲端口,因此它們需要鏈接到類,最好是通過指針。但是如果設備類沒有被定義,我該如何創建這個指針呢?

這大概就是我想要的代碼看起來像......

backbone.h:

typedef struct aPort { 
    std::string portName; 
    Device *ptrDeviceThatOwnsPort; 
} port; 

device.h中:

#include "backbone.h" 

class Device { 
} 

...但是這明顯會在backbone.h中拋出一個錯誤,說設備尚未定義。我嘗試在typedef的前面簡單地在骨幹頭文件中包含設備頭文件,但這不起作用,因爲每個頭文件都依賴於另一個頭文件。在我讀過的地方,在Objectve-C中,有一些沿着「超前類定義」的說法(在Obj-C中很久沒有編碼了),那麼C++中有類似的東西嗎?還是有更好的解決方案來解決我的問題?

任何幫助是非常歡迎和提前感謝。

+0

從我讀過的其他線程,我想你只需要在backbone.h – enhzflep

+0

這有重複噸的單詞「設備」前添加「類」的關鍵字,我只是增加了一個possiblility。 –

+0

這是正確的。它被稱爲前向聲明,我在發佈這個問題後兩分鐘就發現了這個詞。您的答案因此,對於這個遺憾,但許多感謝=] –

回答

6

使用前向聲明。

class Device; 

typedef struct aPort { 
    std::string portName; 
    Device *ptrDeviceThatOwnsPort; 
} port; 
1

在backbone.h中。 add

class Device; 
2

您只需添加Device的前向聲明。要做到這一點,修改「backbone.h」文件,如下所示:

class Device; 
typedef struct aPort { 
    std::string portName; 
    Device *ptrDeviceThatOwnsPort; 
} port; 

這一切就是這麼簡單。

2

由於你的結構只有一個指向Device的指針,你可以通過forward聲明類來獲知它。只要你在它的頭文件aPort聲明之前添加

class Device; 

。如果你不使用指針,你將需要包括Device

1

頭文件中的問題,顯然是因爲bythe時間編譯器到達線

Device *ptrDeviceThatOwnsPort; 

不知道什麼Device是。但是,此時不需要包含Device的標題。由於您正在製作一個指針,因此編譯器知道Device是一個類名就足夠了。通過添加前面的聲明,看起來像

class Device; 

在前面,您將讓編譯器知道它,並且它將能夠生成該指針。