2012-12-06 28 views
2

好的,這是困擾我。相對C++ noob,但長期使用C#和其他語言的經驗。與引用對方的C++頭文件的神祕編譯器錯誤

這裏的問題文件的一個相對簡單的蒸餾:

C2065: 'Component' : undeclared identifier gameobject.h 10 
C2059: syntax error : '>' gameobject.h 10 
C2143: syntax error : missing ';' before '}' gameobject.h 14 
C2143: syntax error : missing ';' before '{' component.h 3 
C2143: syntax error : missing ';' before '}' component.h 11 
C2143: syntax error : missing ';' before '{' gameobject.cpp 8 
C2143: syntax error : missing ';' before '}' gameobject.cpp 9 
C2143: syntax error : missing ';' before '{' gameobject.cpp 13 
C2143: syntax error : missing ';' before '}' gameobject.cpp 14 
C2143: syntax error : missing ';' before '}' gameobject.cpp 16 
C1004: unexpected end-of-file found gameobject.cpp 16 
C2065: 'Component' : undeclared identifier gameobject.h 10 
C2059: syntax error : '>' gameobject.h 10 
C2143: syntax error : missing ';' before '}' gameobject.h 14 
C2143: syntax error : missing ';' before '{' component.h 3 
C2143: syntax error : missing ';' before '}' component.h 11 
C2653: 'Component' : is not a class or namespace name component.cpp 8 
C2143: syntax error : missing ';' before '{' component.cpp 8 
C2143: syntax error : missing ';' before '}' component.cpp 9 
C2653: 'Component' : is not a class or namespace name component.cpp 13 
C1903: unable to recover from previous error(s); stopping compilation component.cpp 13 

/* GameObject.h */ 
#pragma once 
#include <vector> 
class GameObject { 
    public: 
    std::vector<Component *> *Components; 
    GameObject(); 
    ~GameObject(); 
}; 


/* GameObject.cpp */ 
#include "GameObject.h" 
#include "Component.h" 
GameObject::GameObject() { 
} 

GameObject::~GameObject() { 
} 


/* Component.h */ 
#pragma once 
class Component { 
    public: 
    GameObject *Owner; 
    Component(); 
    ~Component(); 
}; 


/* Component.cpp */ 
#include "GameObject.h" 
#include "Component.h" 
Component::Component() { 
} 
Component::~Component() { 
} 

這生成在Visual C++ 2012 21級完全無關的錯誤,我想從一個事實,即它無法編譯組件所產生

有沒有想法?在Component的設計中有一個指向GameObject的指針,而GameObject有一個指向組件的指針矢量是有意義的,所以我不打算重新構建以避免這種情況。我猜我只是做了頭文件錯誤的事情。

在此先感謝您的任何建議,這個讓我瘋狂。

+0

[在C++中包含對方的頭文件可能重複](http://stackoverflow.com/questions/396084/headers-including-each-other-in-c) – godel9

回答

2

所有你需要解決這個問題是增加的前置聲明 - 遊戲對象定義之前,組件,反之亦然

class GameObject; 
class Component { 
... 

class Component; 
class GameObject{ 
... 

從技術上講,你只需要的,因爲你的方法:第二個訂購你的.h文件。但是你最好添加兩個。

這種情況的原因是因爲,如果我們認爲您的.h作爲獨立的C++文件的時候,我們(編譯)遇到的Component指針(向量的定義,爲什麼這是一個指向矢量??),我們仍然不知道Component是什麼。它可能是一個班,一個功能,一個錯字,任何東西。這就是爲什麼你需要一個前向聲明讓編譯器知道它是一個類。

這隻適用於指針/引用其他類的情況。如果它是一個Component對象的矢量,那麼您將別無選擇,只能在定義之前包含標題。

+0

酷 - 所以這是一個訣竅,它是Component類定義之上的「類GameObject;」的前向聲明,反之亦然。謝謝。頭文件吸:) – QuadrupleA

+0

更好的是,只需結合兩個頭文件。每個只是一個概念描述的一部分。 –

+2

隨着時間的推移,這些類將變得更加複雜,所以如果可以的話,我想每個類都保留一個文件。 – QuadrupleA

1

把組件的向前聲明頂部,#pragma之後一次,像這樣......

class Component; // Just this, no more. 

有可能仍然是錯誤的,但是這是一個開始。

我建議您將GameObject.h和Component.h合併到一個文件中。他們緊密相連,所以他們在一起。

+0

謝謝 - 看起來像類的前向聲明是鍵。儘管如此,我還是希望保持一個一對一的文件結構。我認爲.h文件類定義了WERE前向聲明,但我想這只是方法而已,而不是類本身。混亂。 – QuadrupleA

+0

你可以讓它們分開,它仍然可以工作。只要將前面的聲明放在GameObject.h的頂部即可。將它們放在一起消除了依賴性。我不知道你爲什麼要分開他們,但是你會這樣做。 –

+0

同一文件?不好的建議。 –