Bonjour

En faisant dans OnInitialupdate de CAngelView
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
CClasse classe;
classe.sonnomclasse="4°1";
classe.sasalleclasse.Add("salle 14");        <-------------- plantage
pTheApp->mesclasses.Add(classe);         // pTheApp recup avant ds le prog
j'ai
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
c:\Program Files\Microsoft Visual Studio\MyProjects\angel 21 7 14 04 juste apres chgt CArray et 0 bug\angelView.cpp(104) : error C2664: 'CArray<TYPE,ARG_TYPE>::Add' : impossible de convertir le paramètre 1 de 'const char [9]' en 'ATL::CStringT<BaseType,StringTraits> '
        with
        [
            TYPE=CString,
            ARG_TYPE=CString &
        ]
        and
        [
            BaseType=char,
            StringTraits=StrTraitMFC<char>
        ]
        Une référence qui ne retourne pas à 'const' ne peut pas être liée à une non-lvalue
pourtant "sasalleclasse" est bien un CArray de CString déclaré dans CClasse. Ca me rapelle la meme erreur que la fois dernière
Attention aussi sur les declarations d'objets utilisés avec des conteneurs .
pour inserer dans une CList ou CArray le contructeur de copie ou l'operateur d'affection (de l'objet) suivant les cas est appelé .
il convient donc dans le cas d'un objet classe de prendre l'habitude de founir ces methodes.
j'ai donc essayer d'ajouter mon CArray dans le "void copyfrom"
et là, gros plantage. Je suppose qu'il doit y avoir un truc particulier à faire quand il s'agit d'un CArray.

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
#pragma once
 
class CClasse : public CObject
{
public:
    DECLARE_SERIAL( CClasse )
 
    CClasse(){Clear();}
    //-----------------------------
    ~CClasse(){}
    //-----------------------------
    // constructeur de copie
    CClasse(const CClasse &rItem)
    {
        CopyFrom(rItem);
    }
    //-----------------------------
    // operateur d'affectation
    const CClasse& operator=(const CClasse& Src)
    {
        CopyFrom(Src);
        return *this;
    }
    //-----------------------------
    // effacer les données.
    void Clear()
    {
        sonnomclasse="";
       // manque clear du CArray
          }
    //-----------------------------
    // la methode de serialisation.
    void Serialize(CArchive& ar)
    {
        if(ar.IsStoring())
            ar << sonnomclasse  << sasalleclasse      //test n°1   !!!!!!!!!
        else
            ar >> sonnomclasse  ;
    }
    //-----------------------------
    // copier les données d'une source.
    void CopyFrom(const CClasse & Src )
    {
        if(this==&Src) return;
 
        //Clear(); // clear eventuel.
 
        sonnomclasse    = Src.sonnomclasse;
        sasalleclasse = Src.sasalleclasse;             // test n°2 !!!!!!!!!!!!!!!!!!!
 
   }
    //-----------------------------
    // dump pour test
    CString GetStrDump()
    {
        //return ( sasalleclasse);
    }
 
    // les données.
    CString sonnomclasse;
    CArray<CString,CString&> sasalleclasse;
};
// la gestion d'un tableau de cette classe .
typedef CArray<CClasse,CClasse&> CArrayClasse;
Erreur pour le test 1:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Classe.h(37) : error C2678: '<<' binaire : aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'CArchive' (ou il n'existe pas de conversion acceptable)
Erreur pour le test 2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Classe.h(50) : error C2582: 'operator =' fonction non disponible dans 'CArray<TYPE,ARG_TYPE>'

Quelle(s) modification(s) dois-je faire à ma classe pour qu'elle fonctione et plus tard pour qu'elle serialise.
Si tu connais un tuto du genre de CItem mais qui gère un Carray, je suis aussi preneur.
D'avance un enorme merci.