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 :

Constructeur de copie et Template: Transtypage


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 18
    Points : 18
    Points
    18
    Par défaut [Résolu] Constructeur de copie et Template: Transtypage
    Bonjour,

    J'essaye de faire un exercice de C++, et je coince.

    En gros, j'ai une classe template "array" dans laquelle je peux mettre N valeurs de type T.

    Voila le source:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
     
    #include <iostream>
    using namespace std;
     
    class A &#123;
     
    &#125;;
     
    class B&#58; public A &#123;
     
    &#125;;
     
    template <int S, typename T>
    class array &#123;
    //	friend ostream& operator<< <> &#40;ostream&, const array&&#41;;
     
    public&#58;
    	class BadIndex &#123;&#125;;
     
    	array &#40;const T& v=T&#40;&#41;&#41; &#123;for&#40;int i=0 ; i<S ; i++&#41; elem&#91;i&#93; = v;&#125;
     
    	array &#40;const array<S, T >& tableau&#41; &#123; 
    		for&#40;int i=0 ; i<S, i++&#41;
    			elem&#91;i&#93; = tableau.elem&#91;i&#93;;
    	&#125;
     
    	T& operator&#91;&#93; &#40;int x&#41; &#123;
    		if &#40;x<0 || x>=S&#41; throw BadIndex&#40;&#41;;
    		return elem&#91;x&#93;;
    	&#125;
     
    	const T& operator&#91;&#93; &#40;int x&#41; const &#123;
    		if &#40;x<0 || x>=S&#41; throw BadIndex&#40;&#41;;
    		return elem&#91;x&#93;;
    	&#125;
     
    protected&#58;
    	T elem&#91;S&#93;;
    &#125;;
     
     
    int main &#40;&#41; &#123;
    	array<5, int> ti&#40;1&#41;;
    	array<5, B*> tpb;
     
    	array<5, double> td = ti;
    	array<5, A*> tpa = tpb;
    &#125;
    Mon problème est ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	array<5, double> td = ti;
    	array<5, A*> tpa = tpb;
    En effet, le compilateur m'insulte et me dis qu'une conversion est requise entre l'array<5, int> et l'array<5, double>. Ca je l'avais compris ...

    Mais j'ai l'impression qu'il ne prends pas en compte mon constructeur de copie, car avec ou sans, l'erreur de compil est là même.
    Il y a surement une "subtilité" sur les templates qui m'échappe, mais laquelle ?

    Si vous pouviez donc me dire comment faire pour que le transtypage se fasse entre les types T et T' des 2 array) et pas entre le array<S,T> et array<S, T'>

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut,

    je n'ai regardé le détail (encore crevé d'un code que je viens de pondre sur un autre post ), mais j'ai 2 remarques:

    - as-tu testé ta classe sans les templates?
    - pourquoi ne pas dériver la classe BadIndex de exception (avec #include <exception>) ?

  3. #3
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    tu dois implémenter l'opérateur de recopie '=' dans ton template pour qu'il envisage le casting.

    quand tu écris 'monArrayDouble = monArrayInt', le compilo regarde s'il existe le '=' adéquat. or il n'y en a pas, tu dois l'implémenter.

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    - as-tu testé ta classe sans les templates?
    - pourquoi ne pas dériver la classe BadIndex de exception (avec #include <exception>) ?
    Si je teste sans template, je ne vais pas perdre la possibilité d'avoir de transtyper un tableau d'int en tableau de double ?

    Pour l'exception, étant donné que c juste un exo, j'ai pas trop essayé de dvpé le code . Mais je note.

    tu dois implémenter l'opérateur de recopie '=' dans ton template pour qu'il envisage le casting.
    T'as réponse m'étonne ...

    en effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array<5, double> td = ti;
    C'est une initialisation que je fais là non ? Donc c'est le constructeur de copie qui devrait être appelé ...
    Il m'avait semblé que l'opérateur = (assignment) était utilisé pour le code de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    array<5, int> td;
    td = ti;
    Pour moi c'est dans ce cas là que '=' est appelé ... m'a trompé ?
    Je vais quand même essayer de l'implémenter en attendant ...

    merci

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    yo

    il me semble que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array<5, double> td = ti;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    array<5, double> td;
    td = ti;
    sont équivalent.

    1. le constructeur par défaut (sans paramètre) est appelé pour construire td
    2. on recopie ti dans td

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    ca me fait peur ce que tu me dis

    Dans mon cours de C++, j'avais cru comprendre que:
    appelait le constructeur de copie pour b2.
    et
    appelait l'opérateur = ....

    J'avais compris qu'il y a une différence entre l'initialisation et l'assignation .... Ce n'est pas le cas ?

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Non, tu as bien raison

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B b1 = truc; // constructeur par copie
     
    B b2;
    b2 = truc; // operateur d'affectation
    Pour ton constructeur par copie (qui n'est est pas un ! il faudra aussi garder celui que tu as déjà)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class U>
    array &#40;const array<S, U>& tableau&#41; &#123;
          for&#40;int i=0 ; i<S, i++&#41;
             elem&#91;i&#93; = static_cast<T>&#40;tableau.elem&#91;i&#93;&#41;;
       &#125;

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu auras peut-être un problème d'accès à elem qui est privé, array<S, T> et array<S, U> étant deux classes différentes.

    Cette version est plus correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class U>
    array &#40;const array<S, U>& tableau&#41; &#123;
          for&#40;int i=0 ; i<S, i++&#41;
             elem&#91;i&#93; = static_cast<T>&#40;tableau&#91;i&#93;&#41;;
       &#125;

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Merci !!

    Merci beaucoup

    pour l'accès, je pense que ca devrait être bon. En effet elem est privé, mais l'opérateur [] est public, et il me ramène un élement du tableau.

    Autant j'ai galéré sur cet fin d'exercice, autant je comprends beaucoup mieux pas mal de trucs sur les templates.

    Merci encore une fois

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    pour l'accès, je pense que ca devrait être bon. En effet elem est privé, mais l'opérateur [] est public, et il me ramène un élement du tableau
    C'est pour ça que j'ai suggéré la seconde version.

    Content de t'avoir aidé

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/05/2011, 22h58
  2. Template - Appelé le constructeur de copy
    Par Erakis dans le forum Langage
    Réponses: 6
    Dernier message: 06/02/2008, 23h42
  3. Réponses: 6
    Dernier message: 12/07/2007, 19h18
  4. [C++]Heritage et constructeur de copie
    Par matazz dans le forum C++
    Réponses: 2
    Dernier message: 25/03/2005, 13h31
  5. Constructeur de copie modifiant le paramètre ?
    Par Nicodemus dans le forum C++
    Réponses: 4
    Dernier message: 12/01/2005, 22h25

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