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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    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. #2
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    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 295
    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. #3
    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. #4
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    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 295
    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. #5
    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. #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
    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. #7
    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. #8
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    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 295
    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. #9
    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. #10
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    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 295
    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. #11
    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. #12
    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. #13
    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. #14
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    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 295
    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. #15
    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. #16
    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