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

Langage C++ Discussion :

Template - Appelé le constructeur de copy


Sujet :

Langage C++

  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut Template - Appelé le constructeur de copy
    Bonjour à tous,

    Voici un appercu d'une template (liste chaînée double) que j'ai conçu hier :
    CGenericDoubleLinkedList.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template <class T> class CGenericDoubleLinkedList
    {
    public:
    	CGenericDoubleLinkedList(void){...}
    	virtual ~CGenericDoubleLinkedList(void){...}
    	CGenericDoubleLinkedList(const CGenericDoubleLinkedList & copy){...}
    Ensuite voici une classe que qui se sert de ma template :
    SensorList.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class CSensorList
    {
    public:
    	CSensorList(void);
    	CSensorList(const CSensorList & copy);
    	virtual ~CSensorList(void);
     
    private :
    	CGenericDoubleLinkedList<CSensor>   m_ListSensor;
    Et maintenant voici où est mon problème :
    SensorList.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CSensorList::CSensorList(const CSensorList & copy)
    {
         m_ListSensor = CGenericDoubleLinkedList<CSensor>(copy);
    
    }
    J'essais de faire une copie de ma liste mais cela ne fonctionne pas
    J'ai ce message d'erreur : error C2440: '<function-style-cast>' : impossible de convertir de 'const CSensorList' en 'CGenericDoubleLinkedList<T>'

    Merci beaucoup pour votre aide
    Mieux vaut ne rien savoir que beaucoup savoir à moitié !
    Faite vous en pas avec la vie, personne en est sortie vivant !

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    Tu as m_ListSensor de type CGenericDoubleLinkedList<CSensor> et copy de type CSensorList.

    Comment tu veux t'en sortir?
    Il faudrait une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CGenericDoubleLinkedList(const CSensorList & copy){...}
    Mais cette fonction n'existe pas dans ton projet.

  3. #3
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Merde que je suis dans la lune !!!
    Désoloé, j'avais oubilé quelque chose de très important
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CSensorList::CSensorList(const CSensorList & copy)
    {
        m_ListSensor = CGenericDoubleLinkedList<CSensor>(copy.m_ListSensor);
    }
    Mais merci quand même coyotte507, sans toi j'aurais peut-être continué à chercher un petit bout de temps. LoL

    Mes vacances sont dues
    Mieux vaut ne rien savoir que beaucoup savoir à moitié !
    Faite vous en pas avec la vie, personne en est sortie vivant !

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Donc résolu?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ou pour être précis:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CSensorList::CSensorList(const CSensorList & copy)
     : m_ListSensor(CGenericDoubleLinkedList<CSensor>(copy.m_ListSensor))
    {
    }
    Cele t'évite d'utiliser le constructeur par défaut de m_ListSensor pour appeler ensuite l'opérateur = ...

    Au fait, as-tu implémenté ta propre fonction operator= ? C'est nécessaire pour des objets dont le constructeur de copie n'est pas trivial. Le plus simple pour ce genre d'opérateur, c'est faire une fonction de swap:
    Code C++ : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    class UneClasse
    {
    private:
    	int * m_pVal;
    public:
    	UneClasse()
    	 : m_pVal(new int[42])
    	{
    	}
    	UneClasse(UneClasse const &src)
    	 : m_pVal(new int[42])
    	{
    		std::copy(src.m_pVal, src.m_pVal+42, m_pVal);
    	}
    	~UneClasse()
    	{
    		delete[] m_pVal;
    	}
     
    	void Swap(UneClasse &other)
    	{
    		int *tmp = other.m_pVal;
    		other.m_pVal = m_pVal;
    		m_pVal = tmp;
    	}
     
    	UneClasse & operator= (UneClasse const &src)
    	{
    		UneClasse tmp(src);
    		Swap(tmp);
    	}
    };
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    J'ai effectivement overridé l'opérateur =.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    inline CGenericDoubleLinkedList& operator = ( const CGenericDoubleLinkedList& right )
    {
        if(this != &right)
        {
         // Même code que dans le constructeur de copie
        }
        return *this;
    }
    Donc si j'ai bien compris, de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CSensorList::CSensorList(const CSensorList & copy)
     : m_ListSensor(CGenericDoubleLinkedList<CSensor>(copy.m_ListSensor))
    {
    }
    Il y aura que le constructeur de copie qui sera appelé ?

    Tandis que de mon ancienne façon, le constructeur de copie aurait été appelé pour créer l'instance et par la suite ensuite l'opérateur = aurait été appelé pour recopier (dans m_ListSensor) ce que le constructeur de copie venait de créer ?
    Mieux vaut ne rien savoir que beaucoup savoir à moitié !
    Faite vous en pas avec la vie, personne en est sortie vivant !

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet, c'est bien cela.

    Tu devrais remplaçer le code de ton opérateur = par copie + swap. De cette façon, le code du constructeur de copie ne sera pas dupliqué, rendant ton programme plus maintenable.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Impossible d'appeler le constructeur template
    Par Nurza dans le forum Langage
    Réponses: 2
    Dernier message: 21/07/2012, 18h56
  2. Réponses: 2
    Dernier message: 02/05/2011, 21h58
  3. Réponses: 13
    Dernier message: 29/10/2008, 15h14
  4. Réponses: 21
    Dernier message: 05/04/2008, 20h30
  5. Constructeur de copie et Template: Transtypage
    Par ikkyu_os dans le forum Langage
    Réponses: 9
    Dernier message: 26/12/2004, 22h29

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