簡體   English   中英

使用sizeof,malloc和cast的C ++對象實例化

[英]c++ object instantiation using sizeof, malloc and cast

在Java中,我可以使用“類”方法“ newInstance”實例化一個對象,這對我的特定系統確實非常有用。 我現在正在嘗試在C ++中實現類似的目標。

對我來說,如何實現它還不是很明顯,但是經過一番思考....(你明白了嗎...是吧?),我認為可以通過創建一個ClassDescription類來實現,該類的屬性包含' sizeof'類實例和一個newInstance方法,該方法malloc分配此內存量並將其作為void *返回。 然后,調用代碼將需要對其進行適當的轉換。

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

順便說一句..我認識到我可以為類創建一個保存工廠的注冊表,這是一個備份計划。 對於這個問題的答案,我將重點放在我所討論的內容是否有效的特定問題上。

最好的祝福

*附加上下文*此要求的原因是允許通用庫實例化庫用戶知道的類,而不是實例化庫本身。 該庫將具有一些用於實現此目的的元數據,因此可以告知類的大小。 從用戶的角度來看,不必將工廠對象添加到元數據是“更整潔”的事情。

在某些情況下這將是有效的。 要求該類型必須是“普通舊數據類型”(POD)另請參見此答案 )。 如果它有任何更復雜的內容(例如,虛擬成員函數,具有虛擬成員函數的成員,基類也必須是POD等),則它將不起作用,並且行為不確定。

您可以通過執行以下操作檢查類型是否滿足這些要求

#include <type_traits> 

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

一般而言,這可能表明您做錯了。 C ++不是Java,可能有更好的方法來解決潛在的實際問題。

在malloc和cast方法中缺少的是對象的構造。 使用new既可以分配內存,也可以構造內存。 這包括構建v表,調用構造函數等。 類型轉換為malloc分配的內存無效。

請注意, malloc適當大小的內存塊只會為您提供原始內存。 您需要在此存儲塊中構造所需類的對象。 這可以通過使用new放置來實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM