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 :

CList de CList [Fait]


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 13
    Par défaut CList de CList
    Bonjour a tous,
    j'ai un petit soucis et je ne sais pas par quel bout le prendre:
    j'ai une classe Gage contenant une CListe et une autre classe preteur contenant une CList de de Gage...
    evidement ça en marche pas si facilement, donc le compilateur m'envoie ch***:
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxtempl.h(1210) : error C2582: 'operator =' fonction non disponible dans 'Preteur'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xmemory(137) : lors de la compilation de la fonction membre du modèle de classe 'void CList<TYPE,ARG_TYPE>:ump(CDumpContext &) const'
    with
    [
    TYPE=Preteur,
    ARG_TYPE=Preteur &
    ]
    c:\Documents and Settings\jeremie\Mes documents\Visual Studio Projects\RO\ChezMaTanteJCJZ\ChezMaTanteJCJZ\ChezMaTanteJCJZ.h(28) : voir la référence à l'instanciation du modèle de classe 'CList<TYPE,ARG_TYPE>' en cours de compilation
    with
    [
    TYPE=Preteur,
    ARG_TYPE=Preteur &
    ]
    d'ou vient le probleme et comment le resoudre?
    Merci d'avance
    dudesque

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    un bout de code pourrait nous aider à te répondre

  3. #3
    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
    la CList ne possede pas d'opérateur de copie ou de constructeur de copie, meme chose pour ta classe Gage qui doit les fournir.
    le probleme est resolvable comme suit:

    utiliser une CList qui dispose de l'operateur de copie:
    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
     
    #ifndef __LIST_EX_H__
    #define __LIST_EX_H__
     
    #ifndef __AFXTEMPL_H__
        #include <afxtempl.h>
    #endif
     
    ////////////////////////////////////////////////////////////////////////////
     
    template< class TYPE, class ARG_TYPE>
    class CListEx : public CList<TYPE, ARG_TYPE>
    {
    // Construction
    public:
        CListEx (int nBlockSize = 10);
        CListEx (const CListEx &x);
     
    // Assigment
    public:
        CListEx &operator = (const CListEx &x);
     
    };
     
    template< class TYPE, class ARG_TYPE>
    inline
        CListEx<TYPE,ARG_TYPE>::CListEx(int nBlockSize)
        :    CList<TYPE,ARG_TYPE>(nBlockSize)
    {
    }
     
    template< class TYPE, class ARG_TYPE>
    inline
        CListEx<TYPE,ARG_TYPE>::CListEx(const CListEx &x)
    {
        *this = x;
    }
     
    template< class TYPE, class ARG_TYPE>
    inline CListEx<TYPE,ARG_TYPE> &
        CListEx<TYPE,ARG_TYPE>::operator = (const CListEx &x)
    {
        if(this != &x)
        {
            TYPE tDst;
            TYPE tSrc;
            POSITION pos;
     
            RemoveAll();
            pos = x.GetHeadPosition();
            while(pos != NULL)
            {
                tSrc = x.GetNext(pos);
                CopyElements<TYPE>(&tDst,&tSrc,1);
                AddTail(tDst);
            }
        }
     
        return *this;
    }
     
    #endif
    ensuite rajouter l'operateur de copie et le constructeur de copie a ta classe en s'appuyant sur le model suivant:
    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
     
    // la classe qui contient les données 
    class Gage : public CObject
    {
    public:
        DECLARE_SERIAL( Gage )
     
        Gage(){Clear();}
        //-----------------------------
        ~Gage(){}
        //-----------------------------
         // constructeur de copie
        Gage(const Gage &rItem)
        {
            CopyFrom(rItem);
        }
        //-----------------------------
        // operateur d'affectation
        const Gage& operator=(const Gage& Src)
        {
            CopyFrom(Src);
            return *this;
        }
        //-----------------------------
        // effacer les données.
        void Clear()
        {
     //......   
        }
        //-----------------------------
        // copier les données d'une source.
        void CopyFrom(const  Gage& Src )
        {
            if(this==&Src) return;
     
            Clear(); // clear eventuel.
            // copie des données ici a faire...
       }
    //....
     };
    apres on pourra ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef CListEx< Gage,Gage &> ListGage;
    typedef CList<ListGage,ListGage &> ListOfListGage;

  4. #4
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 13
    Par défaut
    merci a tout deux de vous pencher si rapidement sur les problemes des aprentis codeur que nous sommes ;p
    je regarde ta solution fairscape ( d'ailleur c'est pas comme si ça fesait 2 jours que j'epluches tes reponses mfc sur ce forum ;p)
    et je vous tient au courant

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    wow, ça fait plaisir de voir du code comme ça
    A propos, savez-vous les raisons pour lesquelles CList ne possede pas d'opérateur de copie ou de constructeur de copie. Pourquoi les développeurs de microsoft ne l'on pas implémenté?

  6. #6
    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 me le demande bien !
    j'ai la meme chose pour une CMap...

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Et surtout, si l'envie te prend de poster le code de ton CMapEx, sache que rien ni personne ne t'en empêche

  8. #8
    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
    bon puisque c'est demandé si gentiment:


    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
    109
    110
    111
     
    #ifndef __MAPEX_H__
    #define __MAPEX_H__
     
    #if _MSC_VER < 0x0600
        #pragma warning(disable : 4786) //identifier was truncated to '255' characters in the debug information
    #endif
     
    #ifndef __AFXTEMPL_H__
        #include <afxtempl.h>
    #endif
     
    // specialization for CString 
    // extract of CMapStringToPtr::HashKey(LPCTSTR key) const  :)
    template<> 
    inline UINT AFXAPI HashKey<CString> (CString strKey)
    {
        LPCSTR key = strKey;
        UINT nHash = 0;
        while (*key)
        {
            nHash = (nHash<<5) + nHash + *key++;
        }
        return nHash;
    }
     
    template<> 
    inline UINT AFXAPI HashKey<CString&> (CString& strKey)
    {
        LPCSTR key = strKey;
        UINT nHash = 0;
        while (*key)
        {
            nHash = (nHash<<5) + nHash + *key++;
        }
        return nHash;
    }
     
    template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
    class CMapEx : public CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>
    {
     
    public:
     
        CMapEx(int nBlockSize = 10);
       // copy constructor
        CMapEx(const CMapEx &x);
     
        // assigment operator
        CMapEx &operator = (const CMapEx& x);
     
        //The List element currently at this index like CArray
        VALUE GetAt(int nIndex,KEY &rKey) const;
     
        //Gets the number of elements in this List like CArray
        int GetSize( ) const; 
     
    };
     
    template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
    inline CMapEx<KEY, ARG_KEY, VALUE, ARG_VALUE>::CMapEx(int nBlockSize)
        :CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>(nBlockSize)
    {
    }
     
     
    template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
    inline CMapEx<KEY, ARG_KEY, VALUE, ARG_VALUE>::CMapEx(const CMapEx &x)
    {
        *this = x;
    }
     
    template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
    inline CMapEx<KEY, ARG_KEY, VALUE, ARG_VALUE> &
           CMapEx<KEY, ARG_KEY, VALUE, ARG_VALUE>::operator = (const CMapEx& x)
    {
        KEY rKey;
        VALUE rValue;
        POSITION pos = x.GetStartPosition();
     
        RemoveAll();
        while(pos != NULL)
        {
            x.GetNextAssoc(pos,rKey,rValue);
            SetAt(rKey,rValue);
        }
        return *this;
    }
     
    template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
    inline VALUE CMapEx<KEY, ARG_KEY, VALUE, ARG_VALUE>::GetAt(int nIndex,KEY &rKey) const
    {
        ASSERT(nIndex >= 0 && nIndex < GetCount());
     
        POSITION pos = GetStartPosition();    
        VALUE rValue;
     
        do    
        {
            GetNextAssoc(pos,rKey,rValue);
        }while(nIndex --);
     
        return rValue;
    }
     
    template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
    inline int CMapEx<KEY, ARG_KEY, VALUE, ARG_VALUE>::GetSize( ) const
    {
        return GetCount();
    }
    #endif
    exemple:
    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
     
       CMapEx<CString ,CString,CString ,CString> map;
        CMapEx<CString ,CString,CString ,CString> map2;
     
        map.SetAt("VC-MODO1","Farscape");
        map.SetAt("VC-MODO2","Nico");
         map.SetAt("VC-MODO3","BigBoom");
     
        map2=map;
        CString key;
        for(int i=0;i<map2.GetSize();i++)
        {
            TRACE("\n%s",(const char *)map2.GetAt(i,key));
            TRACE("\n%s",(const char *)key);
        }
    vla

  9. #9
    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 finalement voir son cousin CArrayEx :
    http://www.developpez.net/forums/sho...96#post1089996

  10. #10
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut


Discussions similaires

  1. Tri Rapide sur un CLIST
    Par ensisoft dans le forum MFC
    Réponses: 9
    Dernier message: 13/12/2005, 23h22
  2. Réponses: 5
    Dernier message: 29/08/2005, 14h51
  3. erreur quand je veux remplir une CList :
    Par stof dans le forum MFC
    Réponses: 10
    Dernier message: 03/02/2005, 16h18
  4. Comment remplire une CList ?
    Par stof dans le forum MFC
    Réponses: 23
    Dernier message: 02/02/2005, 17h33
  5. [MFC] CList et CComboBox
    Par jonzuzu dans le forum MFC
    Réponses: 9
    Dernier message: 11/05/2004, 14h59

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