i un « fournisseur de données » qui stocke sa sortie dans une struct d'un certain type, par exempleC++ Comment copier en profondeur une structure avec un type de données inconnu?
struct DATA_TYPE1{
std::string data_string;
};
alors ce struct doit être coulé dans un type général, je pensais void * ou char *, car l'objet "intermédiaire" qui le copie et le stocke dans son arbre binaire devrait pouvoir stocker de nombreux types différents de telles données de structure.
struct BINARY_TREE_ENTRY{
void * DATA;
struct BINARY_TREE_ENTRY * next;
};
ce vide * est alors repris plus tard par un autre objet qui jette le vide * retour dans la (struct DATA_TYPE1 *) pour obtenir les données d'origine. donc l'expéditeur et le récepteur connaissent le type de données DATA_TYPE1 mais pas l'objet de copie entre eux.
mais comment l'objet intermidiate copie en profondeur le contenu de les différents struct, quand il ne connaît pas le type de données, que void * et il n'a pas de méthode pour copier le contenu réel; Dynamic_cast ne fonctionne pas pour void *;
l'objet « intermédiaire » devrait faire quelque chose comme:
void store_data(void * CASTED_DATA_STRUCT){
void * DATA_COPY = create_a_deepcopy_of(CASTED_DATA_STRUCT);
push_into_bintree(DATA_COPY);
}
une solution simple serait que l'objet émetteur ne supprimer le struct données envoyées, jusqu'à l'objet de réception a obtenu, mais le envoyer des objets sont créés et supprimés de façon dynamique, avant que le récepteur a reçu les données de l'objet intermédiaire, pour la communication asynchrone, par conséquent je veux copier il.
au lieu de le convertir en void * i a également essayé de conversion à un pointeur superclasse dont la copie intermédiaire objet connaît, et qui est héritée par tous les différents types de données des structs:
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;
}
};
et l'entrée de l'arbre binaire correspondant serait alors:
struct BINARY_TREE_ENTRY{
struct DATA_BASE_OBJECT * DATA;
struct BINARY_TREE_ENTRY * next;
};
et de copier alors le type de données inconnu, je l'ai essayé dans la classe tha t obtient juste le type de données inconnu comme DATA_BASE_OBJECT struct * (avant qu'il ne soit le vide *):
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);
}
i alors ajouté un constructeur de copie au DATA_BASE_OBJECT, mais si le DATA_TYPE1 struct est d'abord casté à un DATA_BASE_OBJECT puis copié , le sous-objet inclus DATA_TYPE1 n'est pas copié également.
i alors pensé que de trouver la taille de l'objet réel à copier et puis juste memcopy, mais les octets ne sont pas stockés dans une ligne et comment puis-je trouver la taille réelle en mémoire du struct DATA_TYPE1 qui contient une chaîne std :: string?Quelles autres méthodes C++ sont disponibles pour copier en profondeur un type de données inconnu (et peut-être obtenir les informations de type de données d'une autre manière pendant l'exécution )?
+1 pour m'avoir battu de 19 secondes. – Cam
Pour souligner ce que Neil a ajouté à propos de la norme: Une bonne utilisation de la norme std est essentielle si vous voulez coder correctement en C++. Il semble que vous codiez d'une manière très semblable à C (par exemple votre utilisation de pointeurs vides), ce qui n'est généralement pas accepté comme bon C++. Vous devriez regarder dans la STL et aussi regarder dans les modèles. – Cam
+1 pour décourager TOUS LES CAPS. Mes yeux! :-D – DevSolar