2010-11-23 188 views
1

假設我有一個抽象基類A,並從中派生B.C++:返回子類指針

用下面的代碼:

A* myInst = (A*) new B; 

A* GetA() { return myInst; } 
B* GetB() { return (B*) myInst; } 

第一功能編譯,第二不。錯誤:error C2143: syntax error : missing ';' before '*'

  • 爲什麼我不能返回指向子類A的指針?

如果我用return NULL;替換函數的內容,也會出現錯誤!

+0

函數聲明後面的額外分號似乎很奇怪。嘗試刪除它。 – Lagerbaer 2010-11-23 15:39:06

+0

不用說,函數原來是inline – Parror 2010-11-23 15:39:53

+0

這個錯誤實際上是指哪一行?您可能想向我們展示整個代碼,因爲`;`錯誤可能不僅僅意味着缺少分號(模糊,是) – birryree 2010-11-23 15:41:50

回答

0

你試過了大括號後的尾部分號?例如:

A* myInst = (A*) new B; 

A* GetA() { return myInst; } 
B* GetB() { return (B*) myInst; } 

注:我沒有嘗試過這個,因爲我沒有訪問C++編譯器在這一刻......

4

的問題是最有可能的是,編譯器不知道AB是。包括最有可能的失蹤。

但除此之外,永遠不要將C風格類型與類一起使用。或者甚至更好。

使用static_cast(如果您確定轉換正常)或dynamic_cast(如果您需要檢查)。

0

我會猜測,這些行出現在實際代碼中的單獨文件中,因爲如果它們出現在顯示中,我看不到任何錯誤。

最有可能發生的情況是,在定義了GetB的任何地方,您忘記了包含B,並且編譯器無法弄清楚它是一種類型。

此外,如果您還使用static_cast而不是C風格轉換,編譯器會警告您是否無法確定AB之間的關係。

1

注意C++中的C風格轉換。作爲一個經驗法則:從來沒有使用它們。使用適當的C++強制轉換。

除此之外,第一投是完全多餘:

A* myInst = new B; 

A* GetA() { return myInst; } 
B* GetB() { return static_cast<B*>(myInst); } 

這工作得很好。

0

大多數情況下,你不應該投擲。

B bInst 
A * myInst = &bInst; 
A* getA() { return &bInst; } 
B* getB() { return &bInst; } 

簡單!

在極少數情況下,您需要放下層次結構。通常這是加載某種附件的地方,需要檢查一個對象是否是您期望的類型。在這種情況下,您可以使用dynamic_cast <>來檢查,但必須有RTTI。

另一種情況發生在存儲不相關類型的地方,例如變體/「任何」類型,這些類型僅與它們一起存儲在單個集合中的事實相關,並且可能在檢索後以不同方式處理。這也可能發生在狀態機中。儘管可能在這裏設計流程以避免鑄造,但有時鑄造更容易。在這種情況下,儘管你確切地知道你有什麼類型,並且可以在層次結構中static_cast到它。