2012-05-08 72 views
0

在Java中,我可以使用'Class'方法'newInstance'實例化一個對象,對於我的特定系統我確實非常有用。我現在試圖在C++中實現類似的東西。使用sizeof,malloc和cast的C++對象實例化

它對我而言並不明顯,但是經過一些反思後......(你懂了嗎......呵呵)我認爲創建一個ClassDescription類可能是有可能的,屬性持有'sizeof'類實例和一個方法newInstance malloc這個內存量並將其作爲void *返回。調用代碼將需要適當地施放此代碼。

C++語言是否適當地定義了這是否有效?

順便說一句..我認識到我可以創建一個註冊表,保存班級的工廠,這是一個備份計劃。對於這個問題的答案,我會重視關於我所討論的內容是否可行的具體問題。

問候

*附加的上下文* 這樣做的理由要求是,讓一個通用庫實例化哪一個圖書館用戶知道的類,但不是庫本身。圖書館將有一些元數據用於實現這一點,因此可以告訴課程大小。從用戶的角度來看,它是'整潔'的,不必將工廠對象添加到元數據中。

+1

爲什麼不給你的類一個私有的構造函數並從靜態方法調用'new Class'?不要使用malloc,它不會爲你調用類的構造函數。 – Benj

+0

你問爲什麼'malloc'不用於在C++中分配對象實例? –

+0

如果你想走下去這條路線,那麼你應該看看[放置新](http://stackoverflow.com/questions/222557/cs-placement-new) – tinman

回答

4

這在某些情況下會有效。要求是該類型必須是"plain old data type" (POD)see also this answer)。如果它更復雜(例如虛擬成員函數,具有虛擬成員函數的成員,基類也必須是POD等),那麼它將不起作用並且是未定義的行爲。

您可以check if a type meets these requirements這樣做:

#include <type_traits> 

static_assert(std::is_pod<A>::value, "A must be a POD type."); 

雖然在一般很可能預示着你這樣做是錯誤的。 C++不是Java,可能有更好的方法來解決潛在的實際問題。

+0

你的鏈接說'type_traits'是C++ 11 ...在這種情況下,它會限制這種方法的用處... – user1055604

+0

@ user1055604 - boost有一個'is_pod',但是它的用處有限, C++ 11 IIRC。如果你願意獨自進行賭注,你總是可以在沒有斷言的情況下做到這一點。而MSVC和最近的GCC以及clang都支持這一點。我相信它也在TR1中,它在C++ 11之前會有所不同。此答案列出了此類行爲合法的要求,並說明如何驗證它們是否已通過代碼驗證。 – Flexo

2

你在malloc和cast方法中缺少的是構造對象。使用new都分配內存並構造它。這包括構建v表,調用構造函數等。類型強制malloc分配的內存無效。

0

請注意,malloc合適的大小的內存塊只能提供原始內存。您需要在此內存塊中構建所需類的對象。這可以使用placement new來實現。