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

jlassira comment initialiser un... 03/02/2006, 11h44
r0d oui. L'utilisation d'un... 03/02/2006, 12h03
Laurent Gomila La déclaration d'un... 03/02/2006, 12h06
jlassira donc tu suggere que je... 03/02/2006, 12h20
r0d euh, la syntaxe est fausse.... 03/02/2006, 12h21
jlassira oui mon application est basée... 03/02/2006, 12h25
r0d Bon, j'ai encore fait une... 03/02/2006, 13h40
jlassira 1- oui mais ou est ce que je... 03/02/2006, 15h26
r0d Un exemple: MonElement*... 03/02/2006, 15h47
jlassira include "CCard.h" .class... 03/02/2006, 16h16
r0d tu as bien inclu le... 03/02/2006, 16h20
jlassira oui c'est bon merci ca... 03/02/2006, 17h04
jlassira salut, malgré que j'ai... 06/02/2006, 10h49
r0d quelle est la signature de... 06/02/2006, 11h16
jlassira string... 06/02/2006, 11h25
r0d voir mon post précédent 06/02/2006, 11h26
jlassira alors c'est ou la faute selon... 06/02/2006, 12h17
jlassira y aura pas de problemes si je... 06/02/2006, 12h29
jlassira j'ai essaye !! mais en vain... 06/02/2006, 13h04
r0d tu utilises mal la méthode... 06/02/2006, 13h54
jlassira crois moi je l'ai enlevé et... 06/02/2006, 14h25
r0d Il est impossible que tu... 06/02/2006, 14h32
jlassira crois moi c'est l'erreur que... 06/02/2006, 14h51
r0d C'est la même erreur? ... 06/02/2006, 15h18
jlassira donc je ne peux pas retourner... 06/02/2006, 15h42
farscape si tu veux utiliser les... 06/02/2006, 15h45
jlassira Oui je l'ai compris ca... 06/02/2006, 15h52
r0d Si, c'est possible de faire... 06/02/2006, 15h57
jlassira Non :( !! j'ai tout changé... 06/02/2006, 16h17
r0d Bon, pas de panique ;) Déjà,... 06/02/2006, 17h09
jlassira merci pour ton effort :) ca... 06/02/2006, 17h23
farscape tu ne peux pas ecrire ça .... 06/02/2006, 17h38
jlassira donc pas d'espoir pour... 06/02/2006, 17h46
r0d Si, comme te dit farscape, il... 06/02/2006, 17h54
farscape la gestion du contructeur de... 06/02/2006, 18h21
Philippe299 Si CArray ce comporte de la... 14/02/2006, 18h57
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 294
    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 294
    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 294
    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 294
    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 294
    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 294
    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 294
    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 294
    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 294
    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 294
    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