IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[serialisation] CList, Vector, fonctionnement


Sujet :

MFC

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut [serialisation] CList, Vector, fonctionnement
    Bonjour à tous,

    Ayant abandonné l'option de liens avec une base de données, je me rabat sur la serialisation, normalement plus simple mais je me retrouve avec de nouveaux problèmes.

    Dans ma classe Document j'ai une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CList<Cemprunteur> listeEmprunteur
    Mon but est de serialiser cette liste.
    Seulement ma classe contient des variables membres, mais aussi un vector :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<CGage> tabG
    Qu'est ce que j'ai fait jusque la :

    1- Appel de la méthode serialize de ma classe Emprunteur à partir de la méthode serialize de ma classe Document.
    2- Surcharge de l'operateur = pour ma classe emprunteur
    3- définition d'un constructeur par recopie pour ma classe emprunteur
    4- Définition de ma méthode serialize dans ma classe Emprunteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    void CEmprunteur::Serialize(CArchive& ar)
    {
     
    	if (ar.IsStoring())
    	{
    		// TODO : ajoutez ici le code de stockage
     
    		//sauvegarde des variables membres
    		ar << this->Nom;
    		ar << this->Prenom;
    		ar << this->Adresse;
    		ar << this->Telephone;
     
    		//sauvegarde du tableau de gage (Vector)
    		/*ar << this->tabG.size();
    		for (std::vector<CGage>::iterator
    			i = this->tabG.begin();
    			i != this->tabG.end();
    			++i)
    			{
    			   ar << *i;
    			}*/
    	}
    	else
    	{
    		// TODO : ajoutez ici le code de chargement
    		ar >> this->Nom;
    		ar >> this->Prenom;
    		ar >> this->Adresse;
    		ar >> this->Telephone;
     
    		/*WORD w;
    		//reccupération du vector de gage
    		this->tabG.clear();
    		ar >> taille;
     
    		CGage g;
    		this->tabG.reserve(taille);
    		for (int i = 0; i < taille; ++i)
    		{
    			ar >> g;
    			this->tabG.push_back(g);
    		}*/
    	}
    }
    Ceci en piochant à droite a gauche des explications, seulement je me retrouve avec pas mal d'erreurs de compilation du genre :

    Error 1 error C2679: binary '=' : no operator found which takes a right-hand operand of type 'const CEmprunteur' (or there is no acceptable conversion) c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxtempl.h 977

    Et de plus je ne suis absolument pas sur que toute ma CList sera serialisée de cette manière.
    N'y aurait-il pas une méthode précise pour ce genre de cas ? La Faq ne m'aide pas vraiment, je ne comprend pas ce qui est expliqué.....

    Je vous remercie des réponses apportées.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    bonsoir ,
    une CList ne se declare pas comme ça voir la doc MSDN.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CList<Cemprunteur, Cemprunteur &> listeEmprunteur;
    j'ai repondu il n' y a pas longtemps sur ce meme sujet sur le forum.
    afxtempl.h est a mettre dans stdafx.h si ce n'est pas le cas.

    [edit]je viens de verifier en plus c'est a toi que j'ai répondu

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    Oups, je pensais pas que cela avait une influence aussi néfaste. Merci beaucoup. Cela m'a parmit d'enlever pas mal d'erreurs.
    J'ai corrigé cela, me reste une erreur sur les bras lors de l'edition des liens :

    Error 2 error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CEmprunteur::GetRuntimeClass(void)const " (?GetRuntimeClass@CEmprunteur@@UBEPAUCRuntimeClass@@XZ) Emprunteur.obj

    Que je ne comprend absolument pas....
    Sinon est ce que ma méthode pour sérialiser est correcte ?

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    ta classe doit utiliser la macro DECLARE_SERIAL,
    voir faq:http://c.developpez.com/faq/vc/?page...HowToSerialize

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    C'est déjà fait...

    Enfin j'ai juste rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE_SERIAL (CEmprunteur)
    au début de ma classe CEmprunteur, c'est bien ca ? Rien d'autre à faire ?

    En fait je ne comprend pas ou il faut que j'écrive ces lignes de code par rapport à la FAQ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template<> void AFXAPI SerializeElements<CItem> (CArchive& ar, CItem* pElements, int nCount);
     
    // la gestion d'un tableau de cette classe .
    typedef CArray<CItem,CItem&> CArrayItem;
     
    // Source.........................
    //---------------------------------------------------------------------------------------
    // definition de la methode de serialisation de l'objet CItem pour le template CArray.
    template <>  void AFXAPI SerializeElements <CItem> ( CArchive& ar, 
        CItem* pItem, int nCount )
    {
        for ( int i = 0; i < nCount; i++, pItem++ )            
            pItem->Serialize( ar );    
    }

  6. #6
    Membre expérimenté
    Avatar de Nicolas Bauland
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 119
    Par défaut
    Une question probablement bebete mais pourquoi melanger des classes MFC (CList) et STL (vector) ? Ne serait-il pas plus judicieux de tout basculer en MFC et de faire une liste également a la place du vector ?

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    et le IMPLEMENT_SERIAL tu l'as mis ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    J'avais essayé au départ de faire une CList, mais je n'y suis pas arrivé. Je m'étais donc rabattu sur un vector en attendant, maintenant il faudrait reprendre toutes les méthodes misent en place...

    Mais mon problème ne vient pas de la, tout compte fait.

    Edit : Oui j'ai aussi mis le IMPLEMENT_SERIAL....

  9. #9
    Membre expérimenté
    Avatar de Nicolas Bauland
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 119
    Par défaut
    Citation Envoyé par samtheh
    Enfin j'ai juste rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE_SERIAL (CEmprunteur)
    au début de ma classe CEmprunteur, c'est bien ca ? Rien d'autre à faire ?
    Oui, absolument.
    Citation Envoyé par samtheh
    En fait je ne comprend pas ou il faut que j'écrive ces lignes de code par rapport à la FAQ.
    Je pense que dans ton cas tu n'en as pas besoin.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    Donc d'ou peut venir le problème ???
    Je ne vois pas la.

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    si il veut utiliser la serialisation d"une liste il faut les deux macros declare et implement.
    la fonction de la faq permet permet une specialisation de la fonction serializeelement du template.
    permettant la serialisation de l'objet CList.
    mais c'est expliqué et il y a un exemple dans la faq.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    J'ai suivit l'exemple de la FAQ à l'identique.

    Il me reste un bout de code (extrait dans un post un peu plus haut) que je ne sais pas placer, dans quel fichier ? la FAQ n'est pas vraiment explicite la dessus.

    Mais d'après Nicolas Bauland je n'ai pas besoin de ces quelques lignes de code ?

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Citation Envoyé par farscape
    bonsoir ,
    une CList ne se declare pas comme ça voir la doc MSDN.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CList<Cemprunteur, Cemprunteur &> listeEmprunteur;
    j'ai repondu il n' y a pas longtemps sur ce meme sujet sur le forum.
    afxtempl.h est a mettre dans stdafx.h si ce n'est pas le cas.

    [edit]je viens de verifier en plus c'est a toi que j'ai répondu
    Pour être précis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<class TYPE, class ARG_TYPE = const TYPE&>
    class CList : public CObject
    Par défaut, la référence est const. Donc, si on ne modifie pas les éléments (et les sérialiser, c'est les modifier ), c'est pareil.
    Mais là, comme on les modifie...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    Et donc cela change quoi ?
    Une réponse claire s-il te plait pour un novice ?

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    En fait, je me préparais à dire à farscape qu'il avait tord, puisqu'il y avait un paramètre par défaut, puis je me suis rendu compte qu'il avait raison.

    donc, si tu as encore une CList< CEmprunteur >, il faut effectivement que tu changes pour que la sérialisation compile.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    Ce changement a déjà été fait.
    Cela me corrige de nombreuses erreurs mais cette erreur subsiste :

    Error 2 error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CEmprunteur::GetRuntimeClass(void)const " (?GetRuntimeClass@CEmprunteur@@UBEPAUCRuntimeClass@@XZ) Emprunteur.obj

  17. #17
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    je t'ai déjà répondu sur le sujet !
    ta classe doit deriver de CObjet .
    tu dois avoir le jeux de macros complet : DECLARE et IMPLEMENT. (cf le post de la faq)
    sinon tu auras l'erreur que tu signales....

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    Mais j'ai déjà fait tout ca....
    Et je conserve la même erreur....

  19. #19
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    tu dois te tromper quelque part .
    il faudrait l'ensemble .h et .cpp.

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    fichier .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    class CEmprunteur : CObject
    {
    	DECLARE_SERIAL (CEmprunteur)
     
    public:
    	CEmprunteur();
    	CEmprunteur(CEmprunteur& em);
    	CEmprunteur operator = (CEmprunteur& em);
    	virtual ~CEmprunteur();
     
    	//méthode de sérialisation
    	virtual void Serialize(CArchive& ar);
     
     
    private:
    	//variable contenant le nom
    	CString Nom;
    	//variable contenant le prenom
    	CString Prenom;
    	//variable contenant l'adresse
    	CString Adresse;
    	//variable contenant le numéro de téléphone
    	CString Telephone;
    	//variable contenant le position de l'emprunteur 
    	//dans la liste chainée (class Chez_CSamuel_ECNajouaDoc)
    	POSITION pos;
     
    	//ce tableau contient la liste des gage déposé par cet emprunteur
    	std::vector<CGage> tabG;
    	//CList<CGage> tabGage;
     
    ...
    };
    fichier .cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    IMPLEMENT_SERIAL (CEmprunteur, CObject, 1)
     
    #include "stdafx.h"
    #include <vector>
    #include "Chez_CSamuel_ECNajoua.h"
    #include "Emprunteur.h"
    #include ".\emprunteur.h"
     
     
     
    // CEmprunteur
     
    CEmprunteur::CEmprunteur()
    {
    	TRACE("Création d'un nouvel objet CEmprunteur\n");
    }
     
    CEmprunteur::~CEmprunteur()
    {
    }
     
    CEmprunteur::CEmprunteur(CEmprunteur& em)
    {
    	Nom = em.Nom;
    	Prenom = em.Prenom;
    	Adresse = em.Adresse;
    	Telephone = em.Telephone;
    	pos = em.pos;
     
    	for (std::vector<CGage>::iterator
    		    i =em.tabG.begin();
    			i != em.tabG.end();
    			++i)
    			{
    				tabG.push_back(*i);
    			}
    }
    // Surcharge de l’opérateur =
    CEmprunteur CEmprunteur::operator = (CEmprunteur& em)
    {
    	Nom = em.Nom;
    	Prenom = em.Prenom;
    	Adresse = em.Adresse;
    	Telephone = em.Telephone;
    	pos = em.pos;
     
        for (std::vector<CGage>::iterator
    			i =em.tabG.begin();
    			i != em.tabG.end();
    			++i)
    			{
    				tabG.push_back(*i);
    			}
     
    	return *this;
    }
     
     
     
    //méthode de sérialisation
    void CEmprunteur::Serialize(CArchive& ar)
    {
     
    	if (ar.IsStoring())
    	{
    		// TODO : ajoutez ici le code de stockage
     
    		//sauvegarde des variables membres
    		ar << this->Nom;
    		ar << this->Prenom;
    		ar << this->Adresse;
    		ar << this->Telephone;
     
    		//sauvegarde du tableau de gage (Vector)
    		/*ar << this->tabG.size();
    		for (std::vector<CGage>::iterator
    			i = this->tabG.begin();
    			i != this->tabG.end();
    			++i)
    			{
    			   ar << *i;
    			}*/
    	}
    	else
    	{
    		// TODO : ajoutez ici le code de chargement
    		ar >> this->Nom;
    		ar >> this->Prenom;
    		ar >> this->Adresse;
    		ar >> this->Telephone;
     
    		/*WORD w;
    		//reccupération du vector de gage
    		this->tabG.clear();
    		ar >> taille;
     
    		CGage g;
    		this->tabG.reserve(taille);
    		for (int i = 0; i < taille; ++i)
    		{
    			ar >> g;
    			this->tabG.push_back(g);
    		}*/
    	}
    }
     
    ...

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/07/2010, 09h24
  2. fonctionnement de std::vector
    Par gbdivers dans le forum SL & STL
    Réponses: 14
    Dernier message: 07/09/2009, 07h37
  3. Réponses: 8
    Dernier message: 12/12/2007, 19h11
  4. serialiser une CListe
    Par samgees dans le forum C++
    Réponses: 2
    Dernier message: 22/03/2006, 22h24
  5. [Collections] Fonctionnement des Vector
    Par Ubum dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 16/03/2006, 11h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo