PERSISTANCE D'OBJETS POLYMORPHES

Signaler
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
-
Messages postés
338
Date d'inscription
jeudi 22 août 2002
Statut
Membre
Dernière intervention
14 juin 2005
-
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

Messages postés
338
Date d'inscription
jeudi 22 août 2002
Statut
Membre
Dernière intervention
14 juin 2005

La réflexion étant limitée en c++, c'est très dur de faire un mécanisme de sérialisation général
Messages postés
22
Date d'inscription
mardi 18 février 2003
Statut
Membre
Dernière intervention
29 juin 2004

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
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
11
ouais pourquoi?
Messages postés
52
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
7 mai 2004

lordbob , si tu veux , g un tuto pour la pop !
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
Vi, dans ce cas, forcément, ca ne va pas...

conclusion, faut faire sa sérialization soi meme
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
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;
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
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
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
11
c'est quoi la "persistance d'objets polymorphes"?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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);
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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?)
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
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