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

 C++ Discussion :

template et classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 63
    Par défaut template et classe
    Salut tous,

    J'essayais de développer sur un exemple de code que j'ai trouvé sur un livre de cours, il s'agit de templates (patrons) et classes, bref, ce que j'essaye de faire, c'est de créer un template d'une classe tableau :

    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
     
    template <class T, int n> class tableau
    {
        T  t[n];
     
        public:
        tableau();
        T & operator [](int);
    };
     
    template <class T, int n> tableau<T,n> :: tableau()
    {
        cout<<"constructeur"<<endl;
     
        }
    template <class T, int n> T & tableau<T,n> :: operator [](int indice){return t[indice];}
    Donc voilà pour le code du template, maintenant, je rajoute une classe point :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class point
    {
         int x, y ;
     
        public :
        point (int abs=1, int ord=1 ) // ici init par défaut à 1
        {
            x=abs ; y=ord ;
            cout << "constr point " << x << " " << y << "\n" ;
        }
        void affiche () { cout << "Coordonnees : " << x << " " << y << "\n" ; }
    } ;
    Tout est prêt, il suffit de tester !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
        int main()
    {
        tableau<point, 5>tab;
         tab[1](5,8);
        tab[1].affiche();
        return 0;
    }
    Mon problème est qu'il y a un conflit entre la déclaration de la variable tab (faite à partir du template tableau, et qui devrait donc accépter le type point) et celle du constructeur supposé me remplir les coordonées du point tab[1]... Je ne sais pas comment procéder et j'espère que vous pourriez me donner un indice, voilà, merci d'avance !

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Je suis loin d'être un expert mais rajouter un constructeur de copie ou surcharger le = de cette façon semble fonctionner (je t'ai remis tout le code):

    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
    50
    51
    52
    53
    #include <iostream>
     
    using namespace std;
     
    template <class T, int n> class tableau
    {
        T  t[n];
     
        public:
        tableau();
        T & operator [](int);
    };
     
    template <class T, int n> tableau<T,n> :: tableau()
    {
        cout<<"constructeur"<<endl;
    }
    template <class T, int n> T & tableau<T,n> :: operator [](int indice){return t[indice];}
     
    class point
    {
         int x, y ;
     
        public :
        int getX() const
        {
            return x;
        }
        int getY() const
        {
            return y;
        }
        point (int abs=1, int ord=1 ) // ici init par défaut à 1
        {
            x=abs ; y=ord ;
            cout << "constr point " << x << " " << y << "\n" ;
        }
        void affiche () { cout << "Coordonnees : " << x << " " << y << "\n" ; }
        point & operator = (const point &point_)
        {
            x = point_.getX();
            y = point_.getY();
        }
    } ;
     
    int main()
    {
        tableau<point, 5>tab;
        tab[1] = point(5,8);
        for(int i=0;i<5;i++)
            tab[i].affiche();
        return 0;
    }

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 63
    Par défaut
    Citation Envoyé par Lintel-oo Voir le message
    Je suis loin d'être un expert mais rajouter un constructeur de copie ou surcharger le = de cette façon semble fonctionner (je t'ai remis tout le code):

    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
    50
    51
    52
    53
    #include <iostream>
     
    using namespace std;
     
    template <class T, int n> class tableau
    {
        T  t[n];
     
        public:
        tableau();
        T & operator [](int);
    };
     
    template <class T, int n> tableau<T,n> :: tableau()
    {
        cout<<"constructeur"<<endl;
    }
    template <class T, int n> T & tableau<T,n> :: operator [](int indice){return t[indice];}
     
    class point
    {
         int x, y ;
     
        public :
        int getX() const
        {
            return x;
        }
        int getY() const
        {
            return y;
        }
        point (int abs=1, int ord=1 ) // ici init par défaut à 1
        {
            x=abs ; y=ord ;
            cout << "constr point " << x << " " << y << "\n" ;
        }
        void affiche () { cout << "Coordonnees : " << x << " " << y << "\n" ; }
        point & operator = (const point &point_)
        {
            x = point_.getX();
            y = point_.getY();
        }
    } ;
     
    int main()
    {
        tableau<point, 5>tab;
        tab[1] = point(5,8);
        for(int i=0;i<5;i++)
            tab[i].affiche();
        return 0;
    }
    Salut,
    Ca j'y avais pensé, en effet l'ajout d'un opérateur ou même d'un constructeur par recopie fera l'affaire, moi je voulais plutôt savoir comment est-ce qu'il serait possible d’évoquer un constructeur par argument lorsqu'on travaille sur des templates, mais merci quand même pour ta réponse !

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Le problème n'a strictement rien à voir avec les génériques.
    La définition de tab s'accompagne de la construction de tout ses membres Et donc de T t[n];. Ce qui correspond à l'appel du constructeur par défaut de tous les éléments du tableau. (En attendant les listes d'initialisations de C++0x ou pour les types non POD) il n'est pas possible de construire individuellement les éléments d'un tableau.

    Cette ligne signifie : appel de l'opérateur [](int) sur tab qui retourne un point. Puis appel de l'opérateur()(int,int) de la classe point ... opérateur qui n'existe pas et provoque une erreur à la compilation.

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 63
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    il n'est pas possible de construire individuellement les éléments d'un tableau.
    Aïe ! Impossible dans le cas général ou pour ce code en particulier ? Mais alors on ferait comment pour initialiser les éléments d'un tableau s'ils sont d'un type classe ?

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Le constructeur par défaut est appelé pour l'ensemble des éléments du tableau.
    Le plus simple pour ta classe est d'utiliser la copie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::fill(tab.begin(),tab.end(),point(1,2));
    Il ne te reste qu'à définir begin() et end() pour ta classe

Discussions similaires

  1. "Template" de classe métier
    Par gbraux dans le forum Design Patterns
    Réponses: 3
    Dernier message: 20/11/2007, 10h37
  2. [Template] Problème Classe Template
    Par gimpycpu dans le forum Langage
    Réponses: 7
    Dernier message: 23/05/2007, 05h10
  3. Méthode template dans classe non template ?
    Par shenron666 dans le forum Langage
    Réponses: 12
    Dernier message: 04/09/2006, 17h50
  4. Utilisation de templates et classe en PHP?
    Par wkd dans le forum Langage
    Réponses: 1
    Dernier message: 01/09/2006, 15h36
  5. Template et classe "amie" ?
    Par tintin72 dans le forum Langage
    Réponses: 21
    Dernier message: 11/07/2006, 22h50

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