我不是在談論一個實例的指針,我想要一個指向類本身的指針。在C++中你可以有一個指向函數的指針,你也可以有一個指向類的指針嗎?
回答
在C++中,類不是「first class objects」。您可以得到的最接近的是一個指向其實例type_info
的指針。
不。指針是運行時計算機內存中某物的地址。一個類只是一組編譯器的指令。
是和否這取決於你想要實現的內容。如果你只是想要一個指向類型的指針那麼沒有沒有辦法。 A 類型不是以指針的形式存在於內存中。
有理由我說是的,但有些人會認爲虛擬表格是指向某種類型的指針。有可能得到這個指針,因爲虛擬表存在於內存中,並且可以用來調用具有一定欺騙性的虛擬方法。
與真正的基於對象的語言不同,類不是C++中的對象,更可惜。您可以最接近「指向類」RTTI:
const std :: type_info & info = typeid(object expression);
type_info具有name()成員finction,並且它們可以相互比較。
「Class」不存在。唯一可以指出的是數據。
「類」的其餘部分實際上是一個調度表。對於類中的每個方法,調度表都有一個指針。這樣,無論當前類型轉換爲什麼類型,該類都會指向您的類的正確方法。這將是無用的訪問。
你的類中的方法(調度表指向的東西)實際上只是在你的類數據指針中傳遞的「函數」。方法的定義非常多,它是一個將類數據作爲參數的函數。在大多數C語言風格的語言中,該數據指針是隱藏的,但被稱爲「this」。
你的類的方法可能遍佈整個代碼庫。由於父類,你甚至不可能發現這些方法彼此相鄰。
正如其他人已經說過的,不可能有指向類的指針。
但是,如果要從運行時選擇的某個類創建新實例,可能需要查看Factory Method(或Abstract Factory)設計模式。
您不能擁有指向某個類的(運行時)指針,但C++的編譯時間概念相似:template parameters。 Boost有一個library致力於操縱他們和traits庫獲取有關類的信息。
根據你想要如何考慮指針,你可以有一個指向類的指針,如果你指的是指向一個整數值。 Boost允許您註冊類型併爲您註冊的每種類型分配一個唯一的整數。如果你註冊的類型都是類,那麼你可以在運行時查看創建你想要的類型的對象所需的代碼,只要你有你想要的類型的值。但是總的來說,類不是語言中的第一類對象,你所希望的最好的方式就是模擬你想要的行爲。
的確,在C++中不支持反射/自省,但是有很多庫會添加許多例如Java的Class功能,並允許程序員獲取表示類的對象,創建一個實例等google C++反射。
- 1. Cocos2d:可以有指向父級類指針的指針嗎?
- 2. 函數可以返回一個指向NULL的指針嗎?
- 3. 可以有兩個指針指向同一個字符串嗎?
- 4. 一個類內的指針可以指向這個嗎?
- 5. 是否有可能有一個指針指向第一個指針所指向的變量的指針?
- 6. C++通過函數指針指向另一個函數指針
- 7. 函數指針指向一個函數指針的函數
- 8. 你可以在C++中聲明一個指針作爲extern嗎?
- 9. 爲什麼指向List的指針也可以指向Node?
- 10. 嵌套類可以有一個指向外部類的成員指針嗎?
- 11. C++指向一個類的指針
- 12. 我可以在函數中傳遞一個指向自己的指針嗎?
- 13. gcc:你可以把函數指針指向不同的部分(不是.data)嗎?
- 14. 可以將一個void指針安全地指向annother指針嗎?
- 15. 你可以改變指針指向的大小
- 16. 你可以傳遞數據到一個空指針而不用指向變量的指針
- 17. const指針指向一個const指針
- 18. C - 你如何從一個指向指向該值的指針訪問值?
- 19. 將指針指向類函數以指向函數
- 20. 指針數組和指針指向一個數組在C++
- 21. 我可以得到一個指向當前函數的指針嗎?
- 22. C - fscanf - 你可以向前移動文件指針嗎?
- 23. 如何做一個指向一個類的函數的指針
- 24. 指針指向一個函數,需要指針參數
- 25. 爲什麼有人需要一個指向指針的指針?
- 26. 將一個指向成員函數的指針指向另一個同類
- 27. 設置指向指針的數組,指向另一個數組中的指針
- 28. 傳遞指向C++中另一個指針的'const'指針
- 29. C++:指向「新類()」函數的指針
- 30. UML:當一個類具有指向其他類的指針參數指針時
如果甚至有可能,那不是,指向類的指針甚至會有什麼好處? – 2008-11-13 00:17:13
@Jim Buck:傳遞它,用它來實例化類的新實例,找到它的成員,以及在Java中使用java.lang.Class進行的所有其他有趣的事情。 – CesarB 2008-11-13 00:24:25
啊,是的,你需要在C++中不存在的反射。 – 2008-11-13 01:00:39