我有存儲其輸出在一個特定類型的結構 「數據提供者」,例如C++如何深度複製未知數據類型的結構?
struct DATA_TYPE1{
std::string data_string;
};
然後這個結構必須被鑄造成一個普通的數據類型, 我考慮無效*或char *,因爲「中間」 對象將其複製並存儲在其二進制樹中,因此 能夠存儲許多不同類型的此類結構數據。
struct BINARY_TREE_ENTRY{
void * DATA;
struct BINARY_TREE_ENTRY * next;
};
這一空白*是後來被其它物體 是注塑無效*回(結構DATA_TYPE1 *) 得到原始數據。所以發件人和收件人 知道數據類型DATA_TYPE1,但不知道複製 中間的對象。
但中間對象如何在不知道數據類型的情況下深層複製 不同結構的內容, 只有void *且沒有方法來複制真實內容; dynamic_cast不適用於void *;
「中間」的對象應該這樣做:
void store_data(void * CASTED_DATA_STRUCT){
void * DATA_COPY = create_a_deepcopy_of(CASTED_DATA_STRUCT);
push_into_bintree(DATA_COPY);
}
一個簡單的解決辦法是發送對象不 刪除發送的數據結構,直到接收對象得到它, 但發送對象是動態創建和刪除的,接收者從中間對象獲得數據之前, 進行異步通信,因此我想拷貝 它。
代替將其轉換到void *我也嘗試轉換 到一個超類指針,它的中間複製 對象知道,並且由所有不同 數據類型的結構的繼承:
struct DATA_BASE_OBJECT{
public:
DATA_BASE_OBJECT(){}
DATA_BASE_OBJECT(DATA_BASE_OBJECT * old_ptr){
std::cout << "this should be automatically overridden!" << std::endl;
}
virtual ~DATA_BASE_OBJECT(){}
};
struct DATA_TYPE1 : public DATA_BASE_OBJECT {
public:
string str;
DATA_TYPE1(){}
~DATA_TYPE1(){}
DATA_TYPE1(DATA_TYPE1 * old_ptr){
str = old_ptr->str;
}
};
然後
和相應的二進制樹條目將是:
struct BINARY_TREE_ENTRY{
struct DATA_BASE_OBJECT * DATA;
struct BINARY_TREE_ENTRY * next;
};
,並再複製未知的數據類型,我試圖在類 塔牛逼只是獲取未知的數據類型爲結構DATA_BASE_OBJECT * (之前它是無效*):
void * copy_data(DATA_BASE_OBJECT * data_that_i_get_in_the_sub_struct){
struct DATA_BASE_OBJECT * copy_sub = new DATA_BASE_OBJECT(data_that_i_get_in_the_sub_struct);
push_into_bintree(copy_sub);
}
我再補充一個拷貝構造函數的DATA_BASE_OBJECT,但如果 的結構DATA_TYPE1首先澆鑄爲DATA_BASE_OBJECT然後複製 ,包含的子對象DATA_TYPE1也不會被複制。
我當時以爲怎麼樣找出實際的對象 的大小複製,然後就MEMCOPY,但字節並不存儲在 一行,我如何找出在 內存的實際大小struct DATA_TYPE1持有一個std :: string?
還有哪些其他C++方法可用於深度複製未知數據類型 (並且可能在運行時在 運行時以其他方式獲取數據類型信息)?
+1打我19秒。 – Cam 2010-06-07 08:11:08
爲了強調Neil在std中加入了什麼:如果你想用C++進行正確的代碼,std的良好使用是至關重要的。看起來好像你正在以一種非常類似C的方式進行編碼(例如你使用void指針),這通常不被認爲是好的C++。您應該查看stl並查看模板。 – Cam 2010-06-07 08:17:34
阻止所有上限+1。我的眼睛! :-D – DevSolar 2010-06-07 08:17:38