2014-01-14 51 views
4

我是新來的編程在c + +和組織我的項目鬥爭。 我有一個名爲StateManager的類,它有一個頭文件和一個cpp文件。 cpp包含所有實現。在哪裏把接口類在c + +

如果我現在想打一個接口類:

class IStateManager 
{ 
    public: 
     virtual ~IStateManager() {} 
     virtual void SomeMethod {} 
}; 

我知道接口並不真正存在,因爲他們在C#或Java做的,但我想多類從這個「接口」繼承。

這個類是否還需要一個頭文件和一個cpp文件?或者我可以把它放在一個頭文件中?

+1

接口應該只需要標題,因爲它沒有實現。它可以自己進入頭部,也可以放在另一個更大的頭文件中。 (這裏沒有像Java這樣的限制) – 2014-01-14 16:41:01

+1

@ebyrob:這些方法沒有被聲明爲純虛擬。 –

+0

C++編譯器不編譯頭文件。編譯單元始終是CPP文件。如果您的頭文件(因爲它是_interface_)將被cpp包含在某處,那麼您不需要一個空的cpp文件。這就是說,如果yuo're談論接口...我會讓這些方法是純粹的(而不是空的實現)。 –

回答

4

技術上,C++沒有接口。但是,可以通過多重繼承來「創建」接口(或者如果您的類是「基本」類並且不需要從多個類繼承),可以創建接口。你的「界面」在哪裏生活完全取決於你。但是,如果你打算使用一個類作爲接口(沒有任何實際的實現,因爲在技術上接口沒有實現,直到函數在子類中定義),我會把它放在它自己的頭文件中並聲明每個功能純虛:

class IStateManager 
{ 
    public: 
     virtual ~IStateManager() {} 
     virtual void SomeMethod() = 0; 
     virtual void AnotherMethod() = 0; 
}; 

class TheState : public IStateManager, public SomeOtherParentClass 
{ 
    virtual void SomeMethod(); // Defined in this class 
    virtual void AnotherMethod(); // Also defined in this class 
    //.. 
}; 

如果要定義在了IStateManager類的.cpp一些實現,那麼你真的有更多的一個抽象類,而不是一個接口。

因此,最後我要說的是:「interface」的任何實現都應該在其實現類的.cpp文件中定義。如果你打算在多個文件中使用這個接口,我會爲它創建一個單獨的.h文件。

0

您可以在頭文件中放置類方法的實現。這並不意味着你應該。這與您稱之爲「界面」類的事實無關。

我不會稱之爲接口類,因爲你的方法不是純粹的。

+0

我知道接口並不像他們在c#或Java中那樣存在,但我想要多個類從這個「接口」繼承。所以我希望它與其他文件隔離或我錯過了你的觀點? –

+2

我當然不會創建一個.cpp文件來存儲一組空花括號'{}'。 (雖然「我應該如何在C++中創建一個接口」當然是一個相關的問題,並沒有直接提出) – 2014-01-14 16:44:17