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 :

Héritage et opérateurs "externes"


Sujet :

Langage C++

  1. #1
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut Héritage et opérateurs "externes"
    Bonjour,

    Je me suis inspiré de l'article de Laurent Gomila (Meta-Prog) pour essayer de produire mes propres structures mathématiques et arbres d'expressions.
    Mes opérateurs sont donc d'abord déclarés de façon "globale" grâce aux template puis spécialisés, par exemple pour une structure Vector. Pour illustration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template< typename T1, typename T2 >
    inline BinaryExpression<T1, T2, Operator_Addition> operator+( const T1& t1, const T2& t2)
    {
        return BinaryExpression<T1, T2, Operator_Addition>(t1, t2);
    }
    Et le prototype de la structure Vector (avec T le type à utiliser et Dim, la dimension), suivi du début de la spécialisation pour l'opérateur + :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<typename T, unsigned int Dim> struct Vector;
     
    template< typename T1, typename T2, unsigned int Dim> // V + V
    inline
    BinaryExpression< typename Vector<T1, Dim>::ConstIterator, typename Vector<T2, Dim>::ConstIterator, Operator_Addition>
    operator+( const Vector<T1, Dim>& t1 , const Vector<T2, Dim>& t2)
    //...
    Mais je voudrais maintenant créer des classes dérivant de Vector et pouvant réutiliser le code fournit pour l'opérateur +. Par exemple, je pensais à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template<typename T, unsigned int Row, unsigned int Column>
    struct Matrix : public Vector<T, Row*Column>
    //...
    Comment puis-je faire? Pui-je le faire sans avoir à re-spécialiser l'opérateur + pour chaque type???

  2. #2
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Je me permets de m'auto-répondre pour apporter un complément, et peut-être une clarification :
    En fait, je dispose d'une classe A pour laquelle j'ai définit la surcharge des opérateurs (+, -, * etc.) et sans que cette surcharge soit un membre de la classe A. Je veux maintenant créer une classe B qui hérite de A et les opérateurs définis précédemment doivent aussi pouvoir s'appliquer à B. Je voudrais éviter de devoir reproduire la spécialisation des opérateurs pour B, comment puis-je faire?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Polymorphisme
    As-tu pensé à créer une classe abstraite, puis, tu hérites A et B. Tes fonctions "externes", comme tu les nommes, recevront alors un paramètre de type pointeur sur la classe abstraite (forcément, tu ne peux pas l'instancier).
    Et voilà, tu as utilisé le polymorphisme !
    C'est magique !
    Je n'ai pas d'adresse de tuto là-dessus sous la main, mais je suis certain que tu en trouveras un sur ce site.
    Bonne continuation !

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