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 :

comment initialiser un tableau dans un constructeur ?


Sujet :

MFC

  1. #21
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    crois moi je l'ai enlevé et ca compile toujours pas avec la meme erreur !!

    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
     
    #include "..\include\ccardlist.h" 
    #include "CCard.h" 
    #include <afxtempl.h> 
    typedef  CArray <string,string> FBCList; 
     
    ... 
    FBCList CCardList::getRemainingCards(CCardList m_CurrentCardList) 
    { 
        FBCList UntreatedCards ; 
     
       for ( int i = 0 ; m_CurrentCardList.CurrentCardList.GetSize() ; i++) 
       { 
         CCard a ; 
        if (a.getchecked() == false) 
         UntreatedCards.Add(a.getFBC());    
     
       } 
     
       return UntreatedCards ; 
     
    }
    Ce que l'on fait dans sa vie...

  2. #22
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Il est impossible que tu obtiennes la même erreur si tu n'utilises plus la méthode Copy().
    1/ Fais un 'clean' pour 'rebuild'
    2/ Je ne pense pas que l'erreur vienne de là, mais je te conseille fortement de remplacer les 'string' (std lib) par des CString(mfc). Question d'homogénéité.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #23
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    crois moi c'est l'erreur que j'aie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    CCardList.cpp(75): error C2558: class 'CArray<TYPE,ARG_TYPE>' : pas de constructeur de copie disponible ou le constructeur de copie est déclaré 'explicit'
            with
            [
                TYPE=std::string,
                ARG_TYPE=std::string
            ]
    je vais essayer de changer en CString et je et ferai savoir.....juste une minute
    Ce que l'on fait dans sa vie...

  4. #24
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jlassira
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CCardList.cpp(74): error C2660: 'CArray<TYPE,ARG_TYPE>::Copy' : la fonction ne prend pas 0 arguments
            with
            [
                TYPE=std::string,
                ARG_TYPE=std::string
            ]
    Citation Envoyé par jlassira
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CCardList.cpp(75): error C2558: class 'CArray<TYPE,ARG_TYPE>' : pas de constructeur de copie disponible ou le constructeur de copie est déclaré 'explicit'
            with
            [
                TYPE=std::string,
                ARG_TYPE=std::string
            ]
    C'est la même erreur?

    L'erreur que tu obtiens maintenant (C2558) est intéressante et fréquente lorsqu'on utilise des templates. Elle proviens du fait que que la méthode Add() utilise un constructeur de recopie. En gros, elle prend ton objet en paramètre, et elle essaie d'en faire une copie pour l'insérer. Pour cela, elle appelle le constructeur de recopie de l'objet que tu lui passe (cf http://c.developpez.com/faq/cpp/?pag...tructeur_copie )
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #25
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    donc je ne peux pas retourner le resultat souhaitée c'est ca !!
    Ce que l'on fait dans sa vie...

  6. #26
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    si tu veux utiliser les string ,il est plus simple de faire un std::vector<string>
    avec les CString tu pourras faire std::<CString> ou CArray<CString,CString>.
    la stl et les MFC n'utilise pas la meme philosophie.
    exemple la stl privilegie les fonctions de conversions (c_str()) plutot que les operateurs de conversions .

  7. #27
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    Oui je l'ai compris ca ....mais pourquoi quand j'essaie de retourner ce resultat sosu forme de CArray ca me genere cette erreur!! c'est un peu bizarre non!! ...r0d m'a explique un peu le probleme mais je trouve pas vraiement de quoi il s'agit ni comment y remedier !
    Ce que l'on fait dans sa vie...

  8. #28
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Si, c'est possible de faire comme tu veux faire.

    As-tu remplacé tes 'string' par des 'CString'?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  9. #29
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    Non !!

    j'ai tout changé en CString :

    la signatuer de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CString CCard::getFBC()
    {
    	return FBC;
    }
    le CArray aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef CArray <CString,CString> FBCList ;
    et voila la methode :

    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
     
    FBCList CCardList::getRemainingCards(CCardList m_CurrentCardList)
    //void CCardList::getRemainingCards(CCardList m_CurrentCardList)
    {
        FBCList UntreatedCards ;
     
    	for ( int i = 0 ; m_CurrentCardList.CurrentCardList.GetSize() ; i++)
       {
         CCard a ;
    	 if (a.getchecked() == false)
         UntreatedCards.Add(a.getFBC()); // c'est bien un CString 	
     
       }
     
      return UntreatedCards;	 
     
    }
    mais l'erreur persiste :
    [code]
    CCardList.cpp(75): error C2558: class 'CArray<TYPE,ARG_TYPE>'*: pas de constructeur de copie disponible ou le constructeur de copie est déclaré 'explicit'
    with
    [
    TYPE=CString,
    ARG_TYPE=CString
    ]

    (/code]

    voilà !
    Ce que l'on fait dans sa vie...

  10. #30
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bon, pas de panique
    Déjà, je viens d'implémenter ce que tu tente de faire chez moi, et ça fonctionne très bien. Voilà ce que j'ai fais:

    fichier CCard.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class CCard
    {
    public: 
    	CCard();
    	~CCard();
     
    	void	SetString(CString str);
    	CString GetMyString();
     
    private:
    	CString m_myString;
    };
    fichier CCard.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CCard::CCard(){}
     
    CCard::~CCard(){}
     
    void CCard::SetString(CString str)
    {
    	m_myString = str;
    }
     
    CString CCard::GetMyString()
    {
    	return m_myString;
    }


    mainframe.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    #include "afxtempl.h"
    ...
    typedef CArray <CString, CString> FBCList ; 
    ...
    void UneFonction()
    {
        FBCList UntreatedCards ;
        CCard a;
        a.SetString("toto");
        UntreatedCards.Add(a.GetString());
    }
    Jette un coup d'oeil là-dessus, essaye de comprendre comment ça fonctionne, et peut-être que tu trouvera pourquoi ton code ne compile pas.

    Sinon, envoie plus de détails, et n'hésite pas à faire des 'clean' et des 'rebuild'.

    Courage, tu vas y arriver

    Hope it helps.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  11. #31
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    merci pour ton effort ca me fait vraiement plaisir

    au fait mon probleme ce ,'est pas dans l'ajour d'un element CString mais plutot quand ej veux retourner l'objet FBCList comme resultat!

    si tu chaneg la signature de ta methode de façon a ce qu'elle retourne un FBCList et non plus un void et que tu ajoute un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    FBCListUneFonction() 
    { 
        FBCList UntreatedCards ; 
        CCard a; 
        a.SetString("toto"); 
        UntreatedCards.Add(a.GetString()); 
        return UntreatedCards
    }

    tu verras qeu ca se coince
    Ce que l'on fait dans sa vie...

  12. #32
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    tu ne peux pas ecrire ça .
    le CArray ne dispose pas de constructeur de copie.
    soit tu l'implementes dans une classe derivée de CArray soit tu retournes une reference .mais a ce moment la l'objet ne doit pas etre temporaire.

  13. #33
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    donc pas d'espoir pour recuperer ce resultat ?
    Ce que l'on fait dans sa vie...

  14. #34
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Si, comme te dit farscape, il y a 2 solutions pour le faire (mais c'est peut-être un peu compliqué, je ne connais pas ton niveau en c++):

    1/ tu créés une nouvelle classe dérivée de CArray, et tu lui implémente un constructeur de recopie.

    2/ tu utilise une référence sur ton CArray:
    au lieu de FBCList UneFonction(), tu fais:
    DWORD UneFonctin(FBCList &maListe){...}
    rem: le DWORD retourné est juste pour signaler qu'i est important de gérer les erreurs dans ce genre de fonctions.
    Dans ce cas, tu pourra utiliser maListe (maListe.Add, maListe.removeAt, etc.) mais il faut faire attention à l'allouer avant l'appel de UneFonction et de ne pas la désallouer n'importe quand (c'est à dire: faire attention ou et comment elle est déclarée/allouée, et ne pas oublier de la désallouer (removeAll())... )
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  15. #35
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    la gestion du contructeur de copie et de l'operateur d'affectation peut etre réalisée facilement :
    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
     
    template <class TYPE, class ARG_TYPE>
    class CArrayEx : public CArray<TYPE, ARG_TYPE>
    {
     
    public:
    	CArrayEx (){}
    	CArrayEx (const CArrayEx &x)
    	{
    		*this=x;
    	}
     
     
    public:
    	CArrayEx &operator = (const CArrayEx &x)
    	{
    		if(this != &x)
    		{
    			Copy(x);
    		}
    		return *this;
    	}
    };

  16. #36
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    Si CArray ce comporte de la meme manière que CObArray la méthode CArray::insert prend un pointeur sur l'objet et non l'objet en tant que telle. Vérifie ça si oui tu devras utiliser un pointeur sur ton objet comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MonObjet *objet = new MonObjet();
    CArray liste;
    liste.insert(objet);
    // ou encore:
    MonObjet objet;
    CArray liste;
    liste.insert(&objet);

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 7
    Dernier message: 30/01/2007, 09h48
  2. [C#] Comment intégrer un tableau dans un tableau ?
    Par tazmania dans le forum ASP.NET
    Réponses: 57
    Dernier message: 17/08/2006, 16h59
  3. Réponses: 5
    Dernier message: 11/05/2006, 14h15
  4. Comment définir un tableau dans une classe?
    Par Pragmateek dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 30/04/2006, 20h34
  5. Comment afficher un tableau dans TStringGrid ?
    Par doubledj dans le forum Composants VCL
    Réponses: 3
    Dernier message: 19/09/2005, 02h21

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