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 :

Manipulation de types de classes, cast et polymorphisme


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Manipulation de types de classes, cast et polymorphisme
    Bonjour tout le monnnnnnnde !!

    Ma question porte aujourd'hui sur les cast et les types des classes.

    J'aimerai réduire ce code pas très joli en une seule instruction plus élégante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Valeur* valeur = 0;
     
    if (typeid(*og)==typeid(ValeurEntiere)) {
    	valeur = new ValeurEntiere( ((ValeurEntiere *)og)->getValeur() + ((ValeurEntiere *)od)->getValeur());
    }
    else if (typeid(*og)==typeid(ValeurReelle)) {
    	valeur = new ValeurReelle( ((ValeurReelle *)og)->getValeur() + ((ValeurReelle *)od)->getValeur());
    }
    else { //cest une chaine
    	valeur = new ValeurChaine( ((ValeurChaine *)og)->getValeur() + ((ValeurChaine *)od)->getValeur());
    }
    Il faut savoir que ValeurEntiere, ValeurReelle et ValeurChaine héritent de Valeur

    J'ai pensé créer une méthode polymorphe dans chacune de ces classes ou redéfinition de l'opérateur "+".
    Avez-vous une manière élégante de faire ceci ?

    Merci d'avance !

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    En utilisant les template plutôt que le polymorphisme ?
    Exemple:
    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
     
    #include <iostream>
    #include <string>
     
    template <class T> class Valeur;
    template <class T> Valeur<T> operator+(const Valeur<T>& v1,const Valeur<T>& v2);
    template <class T> std::ostream& operator<<(std::ostream& flx, const Valeur<T>& v1);
     
    template <class T> class Valeur
    {
        T val;
     
        friend Valeur<T> operator+ <>(const Valeur<T>& v1,const Valeur<T>& v2); 
        friend std::ostream& operator<< <>(std::ostream& flx, const Valeur<T>& v1);
    public:
        operator T() const {return val;}
        Valeur(T t):val(t){}
        T valeur() const {return val;}
    };
    template <class T> std::ostream& operator<<(std::ostream& flx, const Valeur<T>& v1)
    {
        flx<<v1.val;
        return flx;
    }
    template <class T> Valeur<T> operator+(const Valeur<T>& v1,const Valeur<T>& v2)
    {
        return Valeur<T>(v1.val+v2.val);
    }
     
    int main()
    {
        Valeur<int> v1(1),v2(2);
        std::cout<<v1+v2<<std::endl;
     
        Valeur<std::string> s1("Hello "),s2("wolrd");
        std::cout<<s1+s2<<std::endl;
     
    return 0;
    }
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    De ce que je vois de votre code, vous ne voulez pas "ajouter des torchons aux serviettes". Une ValeurEntiere ne peut être ajoutée qu'à une ValeurEntière, une ValeurReelle ne peut être ajoutée qu'à une ValeurReelle, etc...

    Cela jette un doute sur la pertinence d'avoir une méthode qui ajoute une Valeur à une Valeur dans la classe de base.

    Que souhaitez-vous faire exactement ?

Discussions similaires

  1. Trier un tableau de plusieurs type de classes.
    Par storm_2000 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 14/01/2007, 15h50
  2. Class cast exception
    Par gloglo dans le forum Langage
    Réponses: 3
    Dernier message: 09/01/2007, 18h26
  3. Réponses: 4
    Dernier message: 24/11/2006, 11h36
  4. Manipulation des types énumérés
    Par annoussa dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2006, 04h25
  5. [.NET2.0][C#]Passage type de classe dans une fonction
    Par SLE dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/06/2006, 15h48

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