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 :

[MFC]S�rialisation de CArray< >


Sujet :

MFC

  1. #1
    Membre confirm�
    Inscrit en
    Juin 2004
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 79
    Par d�faut [MFC]S�rialisation de CArray< >
    Bonjour � tous,

    J'aimerai pouvoir s�rialiser une classe CClass1 qui contient, entre autre un tableau m_tabClass2, variable membre qui est une CArray <CClass2*,CClass2*>, template CArray qui contient des pointeurs vers des objets CClass2.
    CClass2 est une classe d�riv�e de CObject.

    Dans la m�thode Serialize (CArchive) de CClass1, j'ai donc �crit :
    m_tabClass2.Serialize(ar) et j'esp�re ainsi appeler la m�thode CClass2::Serialize(CArchive ar). Or cela ne marche pas et je ne sais pas pourquoi...

    si j'ai un tableau CObArray m_tabObject et que je fais m_tabObject.serialize(ar) dans le serialize de CClass1, la m�thode de serialisation de l'object stock� ds le CObArray est pourtant bien appel�...

    Une solution que j'ai trouv� est donc de caster mes objets CClass2 en CObject (puisque CClass2 d�rive de Cobject), de les stocker dans un tableau CObArray, et d'appeler la m�thode de s�rialisation sur ce tableau.. vous avouerez que ce n'est pas tr�s tr�s propre...

    Ensuite, deuxi�me probl�me, dans cette clase CClas1, j'ai �galement un autre tableau m_tabPoint, de type CArray<CPoint*,CPoint*>. Ma solution pr�c�demment �voqu� tombe malheureusement � l'eau car CPoint ne d�rive pas de CObject...

    Ma question est donc la suivante : comment s�rialiser un objet de type CArray<myClass1*,myClass1*> o� myClass1 est d�riv�e de Cobject ou non (comme CPoint par exemple...)

    Merci d'avance pour votre aide!!

  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

  3. #3
    Membre confirm�
    Inscrit en
    Juin 2004
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 79
    Par d�faut
    Salut,

    Malheureusement, je n'arrive pas � faire marcher ma s�rialisation, m�me apr�s avoir lu la FAQ...

    J'ai une classe CClass1 avec un tableau CArray<CClass2,CClass2&>
    Dans ma m�thode Serialize de CClass1, j'ai donc

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    m_tabClass2.Serialize(ar);
    En debuggant, je constate que cela m'appelle cette m�thode
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    template<class TYPE, class ARG_TYPE>
    void CArray<TYPE, ARG_TYPE>::Serialize(CArchive& ar)
    qui est dans AFXTEMPL.H

    et dans cette m�thode, j'ai
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    SerializeElements<TYPE>(ar, m_pData, m_nSize);
    Or cela appelle ensuite :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    template<class TYPE> void AFXAPI SerializeElements(CArchive& ar, TYPE* pElements, int nCount)
    toujours dans afxtempl.h
    et non pas MON serializeElements que j'ai �crit, comme c'est marqu� dans la FAQ :

    // Source.........................
    //---------------------------------------------------------------------------------------
    // definition de la methode de serialisation de l'objet CItem pour le template CArray.
    template <> static void AFXAPI SerializeElements <CItem> ( CArchive& ar,
    CItem* pItem, int nCount )
    {
    for ( int i = 0; i < nCount; i++, pItem++ )
    pItem->Serialize( ar );
    }

    Je ne vois vraiment pas pourquoi ma m�thode de s�rialisation pr l'objet CItem n'est pas utilis�e...help pliz...

  4. #4
    R�dacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par d�faut
    peux-tu donner ton code ?
    - le code de la classe CClass1 (�pur�, c'est-�-dire juste la d�claration de la classe et l'impl�mentation de Serialize)
    - le code o� tu places la m�thode SerializeElement
    - le code o� tu serialises un CClass1


  5. #5
    Membre confirm�
    Inscrit en
    Juin 2004
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 79
    Par d�faut
    Voil� :

    le code de la classe CClass1
    CClass1.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
    #define TAILLEMAT 30
    class CClass1 : public CObject   
    {
     
    	DECLARE_SERIAL (CClass1)
     
    public:
    	void setTrucMuche1();
     
    	CClass1();
    	virtual ~CClass1();
     
    	[b]CArray<CClass2,CClass2&> m_tabClass2;[/b]
     
    	bool m_tab1[TAILLEMAT][TAILLEMAT];
    	int m_tab2[TAILLEMAT][TAILLEMAT];
    	double m_tab3[TAILLEMAT][TAILLEMAT];
     
    	void	Serialize(CArchive &ar);
     
           /*
           ->ici, non recopié, des méthodes de la classe
    	                           des "getteurs" et "setteurs" pour les variables privées
          */
     
    private:
    	//déclarations des variables privées, non recopié ici
    };
    - le code o� tu places la m�thode SerializeElement
    CClass2.Cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    template <> static void AFXAPI SerializeElements <CClass2> (CArchive& ar, CClass2* pItem, int nCount )
    {
    	for ( int i = 0; i < nCount; i++, pItem++ )            
        pItem->Serialize( ar );    
    }
     
    IMPLEMENT_SERIAL ( CClass2,CObject,1)

    - le code o� tu serialises un CClass1
    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
    void CClass1::Serialize(CArchive &ar)
    {
     
    	CObject::Serialize(ar);
     
    	if (ar.IsStoring())
    	{
    		ar << mes variables qui acceptent l'opérateur (int,CString,...)
    	}
    	else
    	{
    		ar>> mes variables qui acceptent l'opérateur (int, CString...)
     
    	}
     
    [b]m_tabClass2.Serialize(ar);[/b]
    }
    et cette m�thode est appel�e dans:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    void CConceptionPdFDoc::Serialize(CArchive& ar)
    {
     
    	pclass1->Serialize(ar);
     
    }
    o� pclass1 est un pointeur vers un objet CClass1.


    Voil�, en esp�rant que cela puisse vous aider � m'aider!
    En tout cas, merci d'avance!

  6. #6
    R�dacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par d�faut
    Citation Envoy� par TigreRouge
    CClass2.Cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    template <> static void AFXAPI SerializeElements <CClass2> (CArchive& ar, CClass2* pItem, int nCount )
    {
    	for ( int i = 0; i < nCount; i++, pItem++ )            
        pItem->Serialize( ar );    
    }
    ce n'est pas dans class2.cpp qu'il faut mettre ce bout de code, mais dans class1.cpp. c'est class1 qui a besoin de savoir comment g�rer la serialisation d'un CArray<class2,class2&>.

  7. #7
    Membre confirm�
    Inscrit en
    Juin 2004
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 79
    Par d�faut
    Merci beaucoup, effectivement ca marche mieux maintenant apparemment!

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [MFC] Carray de CStringList
    Par r0d dans le forum MFC
    R�ponses: 8
    Dernier message: 15/12/2005, 11h22
  2. [MFC] CArray et classe d�riv�e?
    Par TigreRouge dans le forum MFC
    R�ponses: 14
    Dernier message: 02/08/2005, 22h45
  3. [MFC] CArray dans Copyfrom
    Par Gloubi99 dans le forum MFC
    R�ponses: 5
    Dernier message: 22/07/2005, 10h11
  4. [Debutant][MFC]CArray
    Par gwendo dans le forum MFC
    R�ponses: 3
    Dernier message: 23/03/2005, 17h22
  5. [D�butant][MFC] CArray
    Par gwendo dans le forum MFC
    R�ponses: 2
    Dernier message: 21/03/2005, 10h00

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