2011-04-02 23 views
4

我從問題的答案Forward declare a class's public typedef in c++瞭解,前宣佈一些東西,可以在C的typedef是不可能++。正向聲明可能的typedef的C++ 0x

在C++ 0x中可以做這個問題嗎?

否則,進行更改,如:

class X {...}; 
typedef X Z; 

class Y {...}; 
typedef Y Z; 

休息客戶端代碼。

我覺得不應該是這樣,因爲類型定義的一點是,他們應該做的基本類型對客戶透明,所以你可以改變而不會破壞客戶端代碼執行。

澄清

基本上,可以說,我們有可以有兩種選擇:

class X {...}; 
typedef X Z; // (1) 

OR

class Z {...}; // (2) 

我希望能夠在客戶端代碼做到這一點:

class Z; // Or something of this effect, sadly this fails in the case of (1) 

而且無論Z是typedef還是類(對於客戶端來說都應該是透明的),該代碼都不需要更改。

+0

這還不清楚。這個問題是關於類中的typedef聲明的,我想說解決方案是用一個名稱空間替換或增加類。你不能將聲明任何東西轉發爲其他任何東西,所以'class'不能作爲'typedef'聲明。這更像你所問的嗎? – Potatoswatter 2011-04-02 04:48:50

+0

嗨Potatoswatter,我試圖澄清這個問題。 – Clinton 2011-04-02 04:55:35

+0

真的很不錯的庫編寫者爲他們的客戶端提供公共類型和轉發,因此客戶端永遠不需要手動管理它。客戶端只包含庫的類型頭。這也很好,所以你的庫頭不會有所有的轉發噪音。轉發和typedefs在編譯時不需要花費任何東西 - 只需將公共類型放在那裏即可。 – justin 2011-04-02 04:56:07

回答

1

假設頭被包括在用戶的消息來源「頭」,他們就不會向前聲明你的類。如果用戶想要一個輕量級標題,給他們一個。

標準庫包括一個報頭包括前向聲明的,<iosfwd>。您可能會採用或適應該慣例,例如"foo_forward.h"

當用戶爲你的類寫一個向前聲明,任何地方,他基本上是寫你的頭你。這是一個站不住腳的安排。

1

typedef爲某種類型創建另一個名稱。當你做

typedef X Z; 

你告訴編譯器「Z是X的另一個名字」。如果它不知道當前的X是什麼,那麼這個信息是無用的。

當你說

class X; 

編譯器至少知道,X是用戶定義的類型,這是有幫助的。然後,它可以排除X不是可能需要特殊處理,如void*char的類型之一。

C++ 0x不會改變這一點。