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

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    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

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    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 379
    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 379
    Points : 41 575
    Points
    41 575
    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);
    	}
    };

  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 ?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 575
    Points
    41 575
    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.

+ 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