2008-11-13 87 views
7

我不是在談論一個實例的指針,我想要一個指向類本身的指針。在C++中你可以有一個指向函數的指針,你也可以有一個指向類的指針嗎?

+0

如果甚至有可能,那不是,指向類的指針甚至會有什麼好處? – 2008-11-13 00:17:13

+0

@Jim Buck:傳遞它,用它來實例化類的新實例,找到它的成員,以及在Java中使用java.lang.Class進行的所有其他有趣的事情。 – CesarB 2008-11-13 00:24:25

+0

啊,是的,你需要在C++中不存在的反射。 – 2008-11-13 01:00:39

回答

17

在C++中,類不是「first class objects」。您可以得到的最接近的是一個指向其實例type_info的指針。

5

不。指針是運行時計算機內存中某物的地址。一個類只是一組編譯器的指令。

1

是和否這取決於你想要實現的內容。如果你只是想要一個指向類型的指針那麼沒有沒有辦法。 A 類型不是以指針的形式存在於內存中。

有理由我說是的,但有些人會認爲虛擬表格是指向某種類型的指針。有可能得到這個指針,因爲虛擬表存在於內存中,並且可以用來調用具有一定欺騙性的虛擬方法。

1

與真正的基於對象的語言不同,類不是C++中的對象,更可惜。您可以最接近「指向類」RTTI:

const std :: type_info & info = typeid(object expression);

type_info具有name()成員finction,並且它們可以相互比較。

1

「Class」不存在。唯一可以指出的是數據。

「類」的其餘部分實際上是一個調度表。對於類中的每個方法,調度表都有一個指針。這樣,無論當前類型轉換爲什麼類型,該類都會指向您的類的正確方法。這將是無用的訪問。

你的類中的方法(調度表指向的東西)實際上只是在你的類數據指針中傳遞的「函數」。方法的定義非常多,它是一個將類數據作爲參數的函數。在大多數C語言風格的語言中,該數據指針是隱藏的,但被稱爲「this」。

你的類的方法可能遍佈整個代碼庫。由於父類,你甚至不可能發現這些方法彼此相鄰。

4

正如其他人已經說過的,不可能有指向類的指針。

但是,如果要從運行時選擇的某個類創建新實例,可能需要查看Factory Method(或Abstract Factory)設計模式。

1

您不能擁有指向某個類的(運行時)指針,但C++的編譯時間概念相似:template parametersBoost有一個library致力於操縱他們和traits庫獲取有關類的信息。

0

根據你想要如何考慮指針,你可以有一個指向類的指針,如果你指的是指向一個整數值。 Boost允許您註冊類型併爲您註冊的每種類型分配一個唯一的整數。如果你註冊的類型都是類,那麼你可以在運行時查看創建你想要的類型的對象所需的代碼,只要你有你想要的類型的值。但是總的來說,類不是語言中的第一類對象,你所希望的最好的方式就是模擬你想要的行爲。

0

的確,在C++中不支持反射/自省,但是有很多庫會添加許多例如Java的Class功能,並允許程序員獲取表示類的對象,創建一個實例等google C++反射。

相關問題