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 :

Un peu comme un template..


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par défaut Un peu comme un template..
    bonjour,

    desole pour le titre un peu vague, mais je ne sais pas nommer ce que je cherche. je developpe une classe pour faire des calculs dans un corps fini (donc en gros modulo un entier p). j'ai donc créé une classe qui gere tout ca, mais du coup je dois repeter cet entier a chaque fois. par exemple, si je veux calculer modulo 7, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    element a(2,7)
    element b(6,7)
     
    cout << a+b << endl; //affiche 1
    du coup, si je veux coder des matrices, ou des vecteurs avec des elements de ce corps, je dois me trimballer le 7 de partout. je voulais savoir s'il y avat moyen, dans un souci de genricité, de faire un truc analoge aux templates, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    element<7> a(2)
    element<7> b(2)
    du coup, si je programme une classe matrice avec un template, je pourrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    matrice<element<7>> m;
    et du coup, tous mes calculs sur les coefficients se feraient modulo 7 de facon transparente.. je ne sais pas si je suis clair !

  2. #2
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Chez moi, ce 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
    #include <iostream>
     
    using namespace std;
     
     
    template <unsigned N>
    class Element
    {
    	unsigned       val;
     
    public:
    	Element(unsigned val_) : val(val_ % N)
    	{
    	}
     
    	Element& operator=(const Element& e)
    	{
    		val = e.val;
    		return *this;
    	}
     
    	Element operator+(const Element& e)
    	{
    		return Element((val + e.val) % N);
    	}
     
    	operator unsigned()
    	{
    		return val;
    	}
    };
     
     
    int main()
    {
    	Element<7> e1(3);
    	Element<7> e2(6);
     
    	cout << e1 << '\n' << e2 << '\n' << e1 + e2 << endl;
     
    	return 0;
    }
    Affiche

    3
    6
    2

    C'est ce qu'on voulait

    Et ceci ne compile pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Element<7> e1(1);
    Element<3> e2(2);
     
    e1 = e2;
    Par contre ce code compile ! Pourquoi ? A cause de l'operateur de conversion unsigned, faut l'enlever, ça peut créer des surprises comme ça vient de me le faire (et éventuellement le remplacer par un get() ou surcharge de operator<<) ; c'était juste pour simplifier l'affichage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Element<7> e1(1);
    Element<3> e2(2);
     
    cout << e1 + e2 << endl;

  3. #3
    Membre émérite
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par défaut
    ok, merci bien !!

    par contre, je ne comprends pas bien pourquoi ton premier exemple plante, et pourquoi ton operator= retourne qqchose... en general chez moi c'est du void !

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par jobherzt
    ok, merci bien !!

    par contre, je ne comprends pas bien pourquoi ton premier exemple plante, et pourquoi ton operator= retourne qqchose... en general chez moi c'est du void !
    Pour faire a = b = c;
    Si tu retournes un void, ça ne peut pas marcher. operator= devrait retourner toujours une référence vers *this.

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    NB: En général, on préfère écrire l'opérateur + comme une fonction libre, non amie, qui est définie en termes de +=.
    D'autant qu'ici le constructeur n'est pas explicite ce qui permet donc les convertions implicites. Avec un operateur + membre, on perd la symétrie sur l'opération.
    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...

  6. #6
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Tu veux dire un truc comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <int N>
    Element<N> operator+(const Element<N>& a, const Element<N>& b)
    {
    	Element<N> c = a;
    	c += b;
    	return c;
    }
    Et pourquoi on perd en symétrie ?

Discussions similaires

  1. [AC-2003] Créer des rendez-vous périodiques un peu comme sous OutLook.
    Par User dans le forum Contribuez
    Réponses: 10
    Dernier message: 22/07/2015, 08h40
  2. Outil pour créer une app un peu comme le logiciel Qlick View
    Par hjoumane dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 07/11/2013, 13h12
  3. Réponses: 1
    Dernier message: 01/07/2008, 18h19
  4. Existe des outils de generation de doc automatique un peu comme javadoc mais pour C ?
    Par Gruik dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 29/06/2006, 10h48
  5. Cherche un objet un peu comme une TStringList
    Par Desraux dans le forum Langage
    Réponses: 6
    Dernier message: 27/07/2004, 14h04

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