2017-04-06 67 views
0

我有一個關於包括標題的快速問題 我在情況下,我想建立2個類,他們都持有指向其他類的指針。 他們每個人都在不同的標題。 我怎麼能包括的方式,我不會得到識別錯誤的標題我如何包括其他頭已經包含我目前的標題

Client.h

#ifndef CLIENT_H 
#define CLIENT_H 
#include "Viewable.h" 

    class Client{ 
    Viewable *viewptr; 
} 
#endif 

Viewable.h

#ifndef VIEWABLE_H 
#define VIEWABLE_H 
#include "Client.h" 

    class Client{ 
    Client* client; 
} 
#endif 

這段代碼給我標識符錯誤因爲有雙重定義。 我明白爲什麼,我該如何避免該錯誤?

+2

我猜你的意思是寫'類Viewable'在你的第二個代碼塊...的 – wkl

+1

可能的複製[什麼是向前聲明C++?](http://stackoverflow.com/questions/4757565/what-are-forward-declarations-in-c) – wkl

+1

[Resolve頭包括循環依賴項]的可能重複(http://stackoverflow.com/questions/ 625799/resolve-header-include-circular-dependencies) – nwp

回答

0

使之既類的新頭文件:

#ifndef BOTH_H 
#define BOTH_H 

    class Client; 
    class Viewable; 

#endif 

both.h不是包括你的每頭的。

0

我如何可以包括其他的頭已經包括我現在的頭

你不能。沒有辦法做到這一點。它會創建包含的無限遞歸(如果使用標頭守護,它將過早終止)。

我該如何避免該錯誤?

你需要改變你的程序,所以不存在循環依賴,因此可以去除夾雜物之一。

實際上,在示例程序的情況下,兩個類實際上都不依賴於另一個類的定義,所以都不需要包含其他類。關於聲明的更換夾雜物:

class Viewable; 
class Client { 
    Viewable *viewptr; 

...

class Client; 
class Viewable { 
    Client* client; 
+0

我想補充一點,'Client'只能將**指針**保存爲'Viewable'和'Viewable'只能保存d **指針**到'客戶端'。你不能有一個「按值」的成員,因爲那時的編譯器不知道每個其他類的大小,只知道類的名字。 –