У меня есть «провайдер данных», который сохраняет свои выходные данные в структуре
определенного типа, например
struct DATA_TYPE1{
std::string data_string;
};
тогда эта структура должна быть преобразована в общий тип данных,
я думал о void * или char *, потому что "промежуточный"
объект, который копирует и хранит его в своем двоичном дереве, должен
уметь хранить много разных типов таких структурных данных.
struct BINARY_TREE_ENTRY{
void * DATA;
struct BINARY_TREE_ENTRY * next;
};
эта пустота * затем берется другим объектом
который сбрасывает пустоту * обратно в (struct 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;
};
и затем скопировать неизвестный тип данных, я пытался в классе
который просто получает неизвестный тип данных в виде struct 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 также не копируется.
Затем я подумал, что узнать размер реального объекта.
скопировать, а затем просто скопировать его, но байты не хранятся в
одна строка и как я могу узнать реальный размер в памяти
struct DATA_TYPE1, которая содержит std :: string?
Какие другие методы c ++ доступны для глубокой копии неизвестного типа данных
(и, возможно, получить информацию о типе данных как-то еще во время
во время выполнения)?