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 confirmé Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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 ; 
     
    }

  2. #22
    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
    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é.

  3. #23
    Membre confirmé Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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

  4. #24
    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
    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 )

  5. #25
    Membre confirmé Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Par défaut
    donc je ne peux pas retourner le resultat souhaitée c'est ca !!

  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
    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 confirmé Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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 !

  8. #28
    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
    Si, c'est possible de faire comme tu veux faire.

    As-tu remplacé tes 'string' par des 'CString'?

  9. #29
    Membre confirmé Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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à !

  10. #30
    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
    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.

  11. #31
    Membre confirmé Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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

  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
    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 confirmé Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Par défaut
    donc pas d'espoir pour recuperer ce resultat ?

  14. #34
    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
    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())... )

  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
    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
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    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