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 :

Copy constructor ?


Sujet :

MFC

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Copy constructor ?
    Bonjour,

    J'ai besoin pour mon programme de stocker une liste de points. Pour cela, j'utilise CList et CPoint comme suit :

    typedef CList<CPoint,CPoint> Listepoints;

    J'utilise ce type dans une classe pour une des variables membres. Seulement quand je crée une fonction qui permet de retourner une variable de type ListePoints, j'ai une erreur à la compilation : No copy constructor available.

    Voilà la fonction en question :
    Listepoints m_MaListe;
    .....
    .....

    Listepoints CMyClass::GetMaListe()
    {
    return m_MaListe;
    }

    J'ai cherché dans l'aide de Visual C++ mais en vain, je ne m'en sors pas. Pourriez-vous m'aider ?

  2. #2
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Alors, si je ne me trompe pas ...

    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Listepoints CMyClass::GetMaListe() 
    { 
    return m_MaListe; 
    }
    tu comptes retourner une liste de points .... pas juste un pointeur... donc le compilateur doit savoir comment copier ta liste de points (m_MaListe) pour pouvoir en faire une copie et la retourner.
    Il faudrait donc (je pense) creer une classe pour la liste de points, et redéfinir dedans l'opérateur de copie (=), afin qu'il sache comment s'y prendre.

    Mais est-ce que c'est bien ce que tu veux faire (retourner une copie à chaque fois), sachant que si c'est juste pour y accéder c'est bien long...
    Un pointeur ou une référence suffirait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Listepoints* CMyClass::GetMaListe() 
    { 
    return &m_MaListe; 
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Listepoints& CMyClass::GetMaListe() 
    { 
    return m_MaListe; 
    }

    Voilà voilà ... mais attention dans ces cas là à ne pas modifier la liste dans la fonction qui la récupère ( *GetMaListe() pour le pointeur ou GetMaListe() pour la référence)... sinon l'original (m_MaListe) sera modifié aussi.

    Bah euh dis moi si ça marche

    A+


    bigquick
    And still we will be here, standing like statues ...

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Pour pas que l'appelant modifie ce qui est retourné (genre une donnée privée), il y le spécifieur const qui permet justement d'empêcher cela. Retourner un pointeur n'est pas toujours une bonne idée, cela peut laisser croire qu'il faille appeller delete dessus.
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const Listepoints & CMyClass::GetMyList() const
    { 
        return m_MyList; 
    }


    Parenthèse, std::list (qui fait parti du C++ contrairement à CList) défini bien un constructeur de recopie. Par contre, il va y avoir une recopie de tous les chainons (contrairement à des solutions plus complexes essayant de mettre en oeuvre des move semantics -- je ne sais plus si VC++ supporte mojo).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour ces réponses !

    Après réflexion je me suis rendu compte que retourner un pointeur de la liste convenait plus avec ce que je voulais faire. Donc merci de m'avoir éclairé sur le sujet !

    Et au passage je n'ai plus de message d'erreur !

    @+

  5. #5
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    et au passage, la classe CList est un peu une m*$*%ù comparée à celle de la librairie standard C++ fournit par Visual 6.0, d'ailleurs. Si tu as des problèmes de performance sur l'ajout/suppression d'éléments, essayes d'utiliser std::list à la place de CList.
    Perso, ça a été le jour et la nuit en ce qui me concerne, chiffres (que je n'ai plus) à l'appuis.
    Evidemment, c'était dans un contexte et pour des besoins particuliers, mais il y avait un facteur 100 sur le temps d'ajout d'élément entre CList et std::list, temps qui augmentait pour CList et qui restait constant pour std::list.
    A bon entendeur...

Discussions similaires

  1. probleme avec copy constructor
    Par alamata dans le forum C++
    Réponses: 15
    Dernier message: 06/11/2014, 08h34
  2. vector et copy constructor
    Par r0d dans le forum Langage
    Réponses: 5
    Dernier message: 27/12/2012, 19h49
  3. SWAP IDIOM COPY CONSTRUCTOR
    Par guillaume07 dans le forum C++
    Réponses: 32
    Dernier message: 01/06/2010, 07h49
  4. copy constructor/ assignement/ destructor
    Par lafrankette dans le forum Débuter
    Réponses: 5
    Dernier message: 24/08/2009, 18h09
  5. [debutant]probleme avec le copy constructor
    Par Battosaiii dans le forum Débuter
    Réponses: 10
    Dernier message: 09/11/2005, 10h33

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