PERSISTANCE D'OBJETS POLYMORPHES

hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 - 23 mars 2004 à 15:23
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005 - 23 mai 2004 à 17:18
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/21397-persistance-d-objets-polymorphes

BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
23 mai 2004 à 17:18
La réflexion étant limitée en c++, c'est très dur de faire un mécanisme de sérialisation général
cs_azkab Messages postés 22 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 29 juin 2004
10 mai 2004 à 21:59
bonjour tt le monde,
j ai a inserer des informations dans un fichier binaire 'TFileMap'. je sais exactement l'endoirt ou je dois l inserer mais je ne c pa comment faire et le pire c ke je bloque la dessus.
merci d avance
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
14 avril 2004 à 15:49
ouais pourquoi?
soumpro Messages postés 52 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 7 mai 2004
14 avril 2004 à 15:09
lordbob , si tu veux , g un tuto pour la pop !
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
23 mars 2004 à 18:53
Vi, dans ce cas, forcément, ca ne va pas...

conclusion, faut faire sa sérialization soi meme
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
23 mars 2004 à 18:42
LordBob> On m'a dit que ca s'appelait comme ca, c'est le fait d'écrire un objet dans un fichier, et il se trouve que ces objets. J'ai mis polymorphe parce que les objets sont déclarés comme faisant partie d'un classe abstraite.

hilairenicolas> je suis toujours pas d'accord avec toi, ce serait trop simple. Si par exemple on a une donnéee de type char*, on souhaite plutot écrire la chaine plutot que son adresse, or c'est son adresse que ta méthode va écrire. Je pense qu'on est obligé de tout faire à chaque fois, et c'est vrai que ca n'est pas tres satisfaisant
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
23 mars 2004 à 18:28
euh ...
je viens de me rendre compte d'une erreur
faut pas faire un cast sur le this puis apres faire un delete !! NON PAS BIEN !!!

à remplacer par
strcpy(temp,(char*)this);
WriteFile(hFile, temp, sizeof(Fille1), &dwWritten, 0);
delete temp;
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
23 mars 2004 à 18:03
et oui, forcément ... mais dans ce cas là, je ferais un seul WriteFile :

BOOL Fille1::Write(HANDLE hFile) const
{
char * temp = new char[100];
temp = (char*)this;
WriteFile(hFile, temp, sizeof(Fille1), &dwWritten, 0);
delete temp;
return dwWritten == sizeof(Fille1);
}

et pour le read, je créerais un constructeur vide, puis :

Fille1* Fille1::Read(HANDLE hFile)
{
char * temp = new char[100];
ReadFile(hFile, temp, sizeof(Fille1), &dwWritten, 0);
Fille1 * tempF = new Fille1();
tempF = (Fille1*)temp;
delete temp;
if(dwWritten != sizeof(Fille1))
return NULL;
return tempF;
}

ou un truc du genre
je l'ai pas testé avec ta classe, mais sur un petit test rapide, ca passe nickel
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
23 mars 2004 à 17:55
c'est quoi la "persistance d'objets polymorphes"?
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
23 mars 2004 à 17:25
ah oui mais si tu as deux données dans ta classe, tu es obligé appeler plusieurs fois WriteFile
Par exemple si tu as 2 UINT, on fait comme ca:
WriteFile(hFile, &m_n1, 4, &dwWritten, 0);
WriteFile(hFile, &m_n2, 4, &dwWritten, 0);
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
23 mars 2004 à 17:05
et bien justement sizeof(Fille2) te donne 4 (la taille de UINT)

et si fille2 contenait 2 UINT, sizeof(Fille2) te renverrai 8
c'est justement l'interet ; de pas avoir à compter le nombre d'attributs, et surtout, s'il te prend l'envie d'en rajouter un par la suite, pas besoin de tout recalculer
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
23 mars 2004 à 16:36
4 n'est pas la taille de la classe mais la taille d'un UINT, donc j'aurais peut-etre pu mettre sizeof(UINT) si tu veux (comment ferais tu s'il y avait plusieurs données dans la classe?)
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
23 mars 2004 à 15:23
au lieu de faire un
WriteFile(hFile, &m_n, 4, &dwWritten, 0);
j'aurai fait un
WriteFile(hFile, &m_n, sizeof(Fille2), &dwWritten, 0);

ce qui t'évites de marquer la taille de la classe en dur
Rejoignez-nous