2014-02-20 91 views
0

所以,我大約一年前開始學習C++,在此之前我學習了Java C#和VB.NET。現在,我認爲自己是一個先進的C++編碼器。然而,有一件事我沒有完全得到。鏈接過程。繼承人的問題。 現在,即時編碼類遊戲開發XNA庫,與基本的組件系統 - ,但我在編譯時得到編譯器錯誤,C++假裝它不知道具體類型,在這種情況下,GameComponent類不知道ComponentSelector類(反之亦然),儘管其正確包含和鍵入。我要告訴你我的兩個頭文件,希望你能幫助我。C++沒有找到類型定義?

ComponentSelector.hpp:

#ifndef COMPONENTSELECTOR_HPP 
#define COMPONENTSELECTOR_HPP 
#include<sem/System/Types.hpp> 
#include<sem/System/GameComponent.hpp> 
#include<vector> 
namespace sem 
{ 
    class ComponentSelector 
    { 
    public: 
     GameComponent* getComponent1(); //GameComponent does not name a type 
     GameComponent* getComponent2(); //GameComponent does not name a type 
     GameComponent* getComponent3(); //GameComponent does not name a type 
     void addComponent(GameComponent* item); //GameComponent does not name a type 
     void removeComponent1(); 
     void removeComponent2(); 
     void removeComponent3(); 
     void clearList(); 
    private: 
     std::vector<GameComponent*> m_Components; 
    protected: 
    }; 
} 
#endif // COMPONENTSELECTOR_HPP 

GameComponent.hpp:

#ifndef GAMECOMPONENT_HPP 
#define GAMECOMPONENT_HPP 

#include<sem/System/ComponentSelector.hpp> 
#include <sem/System/Types.hpp> 

namespace sem 
{ 
    class GameComponent 
    { 
    public: 
     virtual void load() = 0; 
     virtual void unload() = 0; 
     virtual void update() = 0; 
     virtual void draw() = 0; 

     ComponentSelector* m_Selector; //ComponentSelector does not name a type 

     SEMlong getID(); 
     SEMstring getName(); 
     SEMstring getType(); 
    private: 
     SEMlong m_ComponentID; 
     SEMstring m_ComponentName; 
     SEMstring m_ComponentType; 
    protected: 
    }; 
} 

#endif // GAMECOMPONENT_HPP 

任何解決方案和提示將不勝感激。

+1

在你的第一套#includes之後,你應該輸入Class GameComponent。這被稱爲前向聲明。然後你可以稍後再實施,這就是你正在做的。 – CoryKramer

+0

您似乎表示這裏有兩個頭文件,但您的問題佈局看起來只有一個。這些是在單獨的文件還是隻有一個?如果他們分開,請更新問題以反映這一點。 –

+0

謝謝。我更新了它。 – calcyss

回答

1

您需要ComponentSelector類前向聲明​​在GameComponent類聲明:

// Remove this: #include<sem/System/ComponentSelector.hpp> 
#include <sem/System/Types.hpp> 

namespace sem 
{ 
    class ComponentSelector; // Note the forward declaration added! 

    class GameComponent 
    { 
     // ... 
     ComponentSelector* m_Selector; // Compiles now! 
     // ... 

我建議你做同樣的ComponentSelector聲明頭反之亦然。然後在你要使用任何成員的地方包括完整的類別聲明(這通常在編譯單元中,即.cpp-文件通常)。

+0

如果我這樣做,他們編譯器將失敗時,建設和把這個錯誤信息(舊的錯誤消失):'|| ===生成:x64在sem(編譯器:TDM GCC x64)=== | include \ sem \ System \ Thread.hpp | 21 | warning:內聯函數'static void sem :: Thread :: sleep(sem :: SEMlong)'已用但未定義[默認情況下啓用] | include \ sem \ System \ ComponentSelector.hpp.gch ||沒有這樣的文件或目錄| || ===構建失敗:1個錯誤,1個警告(0分鐘,3秒)=== ' – calcyss

+0

@DanielWanner閱讀我的更新,並查找前瞻性聲明的含義。你提到的那些錯誤是其他地方引起的。如果你遵循我的建議,那麼你一直在問的那個問題應該得到解決。 –

+0

我知道Thread :: sleep警告,但第二個錯誤只發生,如果我轉發宣佈類。 – calcyss