2016-04-12 87 views
1

是否有一種方法可以使用'this'關鍵字或類似的方法創建當前對象類型的指針,以便不明確提及類類型?創建一個類型爲'this'/當前對象的指針

我有一個基類GraphicObjects,它可以充當其他GraphicObjects和派生自GraphicObjects的對象的容器。我認爲這可能比明確指定類中的類型要好,所以我可以在別處使用它/更改類名。

class GraphiObjects { 
    typeid(*this) *a; // Fails. 
    GraphicObjects *b; // This works. 
    GraphicObjects *children_[]; 
}; 

如果有可能,有什麼理由不使用它?

+5

你想實現什麼? 'typeid'返回一個'std :: type_info' *對象*。你有沒有把它與C++ 11的['decltype'](http://en.cppreference.com/w/cpp/language/decltype)混淆?類似於'typename std :: remove_reference :: type a;'在* methods *中完全有效,但是...好吧... – dhke

+0

模板可能能夠拯救你,但爲什麼它不僅可以編寫'Alpha *'?如果這只是一個問題或偏好,那麼我會說「這是語言的一部分,不要繞過它」。 – MicroVirus

+0

@Michael我有一個基類GraphicObjects,它可以充當其他GraphicObjects和派生自GraphicObjects的對象的容器。我認爲這可能比明確指定類中的類型要好,所以我可以在別處使用它/更改類名。 –

回答

1

C++是一種帶有大多數靜態類型系統的編譯語言。特別是,每個表達式都有一個在編譯時確定的類型。例如,在GraphiObjects的函數中,this指針的類型爲GraphiObjects*,可能與const和/或volatile相加。

現在還有類似「運行時類型」的事情,因爲C++是OO語言。由於thisGraphiObjects*指針,因此它可以指向GraphiObjects對象,但也可指向派生類的對象。 typeid支持運行時查詢,但您正嘗試在編譯時使用它。

您可以使用decltype(*this)和成員函數,但不能將其用於成員數據。這是有道理的:const方法有一個const限定的this指針,非const方法沒有,但是對於數據成員,沒有辦法確定this是否應該是const限定的。

+0

感謝您的解釋。 –

+0

C++不是「一種OO語言」(雖然這是它支持的範例),並不意味着它沒有運行時類型。 Python是一種面向對象的語言,具有運行時類型,所以我不確定你想在第二段中說什麼。 –

+0

@TobySpeight:在C++中,「動態類型」並不意味着類型是在運行時創建的。它特別用於表達式引用對象的上下文中,而對象的類型與表達式的類型不匹配。在這種情況下,表達式的類型被稱爲靜態類型,而對象的類型被稱爲動態類型,而前者通常是後者的基類(忽略'void *')。這與C++的'dynamic_cast'有關。 – MSalters

1

有沒有辦法創建一個當前對象類型的指針?

是的,this。創建一個複製this的成員變量充其量是浪費。

我有一個基地class GraphicObjects能夠作爲容器行動從GraphicObjects

衍生請不要這樣做其他GraphicObjects和對象。創建您的對象層次結構並使用標準容器來包含它們。否則,每個對象,即使是非基礎對象都包含一個空的children_成員以及操作它的任何其他成員和功能。這是浪費和混亂。

我認爲這可能比明確指定類中的類型要好,所以我可以在別處使用它/更改類名。

因爲您使用的所有類都在GraphicObjects的層次結構中,所以您應該利用polymorphisim。您可以使用GraphicObjects*引用此層次結構中的所有對象。檢索對象類型與執行dynamic_cast一樣簡單。

我寫了一個相當廣泛的例子來演示使用polymorphisim與容器的位置:http://ideone.com/XSjMHW

編輯:

  1. 並非所有的對象將包含其他對象,這些節點對象其中不包含任何東西應該是一種類型,我們將其稱爲class Node,其中不包含其他物體
  2. 其他物體可能有自己的表情,還含有其他對象,這應該是一個獨立的類型,我們把它叫做class ContainerContainer可無論是從Node繼承或有一個成員Node,它還將包含其他Node S/Container小號
+0

感謝您的信息和示例。我的意思是**當前類型的指針**而不是**當前對象。有點超出了我原來的問題的範圍,但我有一個從GraphicObject繼承的Text圖形對象。然後我有一個按鈕對象,它包含一個Text對象以及它自己的按鈕面的繪圖代碼。然後是一個可以包含零個或多個Graphic對象的Screen/Form對象。你會保持沒有容器的GraphicObject,並在每個派生的對象中只有一個容器?我正在考慮一個非常簡化版的.NET Control類 –

+0

@ mattb5906我編輯過,試圖闡明一種客觀的方法來設置你所描述的類結構。讓我知道這是否合理。 –

+0

太棒了。謝謝你。 –

相關問題