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 :

Problème de définition d'opérateurs avec des templates


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 31
    Points : 27
    Points
    27
    Par défaut Problème de définition d'opérateurs avec des templates
    Bonjour à tous.

    Tout d'abord désolé si ma question a déjà été posée, je fouille le web depuis plusieurs jours à la recherche d'une solution, en vain...

    Voilà mon problème : je suis en train de programmer des méthodes numériques qui travaillent sur des vecteurs et des matrices.
    - J'ai créé une classe abstraite, Matrix, qui implémente des fonctions sur les matrices (carrées). Deux classes héritent de celle-ci : une classe FullMatrix (qui stocke tous les éléments de la matrice), et un classe SparseMatrix (qui stocke les couples indices-valeur de la matrice). Toutes ces classes sont des templates, ce qui me permet de définir des matrices d'int, double, etc.
    - De la même manière j'ai une classe abstraite Vector avec ses deux sous-classes FullVector et SparseVector.

    Ce qui me pose problème est la définition d'opérateurs sur ces classes. En particulier, je voudrais pouvoir définir un opérateur '*' sur ces objets pour pouvoir les multiplier entre eux.
    Je voudrais pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int n=5;
    FullMatrix<double> A(n);
    // remplissage de A
    SparseVector<int> b(n);
    // remplissage de b
    2*A;   // produit scalaire-Matrix
    A*A;   // produit Matrix-Matrix
    A*b;   // produit Matrix-Vector
    2*b;   // produit scalaire-Vector
    // ...
    Et c'est là qu'est mon problème : l'opérateur * ne fait pas le même travail selon les types de ses paramètres. Comment puis-je coder ça ?
    Ce que je voudrais (si c'est possible...) ce sont des opérateurs qui travailleraient sur les classes Matrix et Vector plutôt que sur les FullMatrix, SparseMatrix, FullVector et Sparse Vector, parce que je vais augmenter le nombre de manières de stocker ces objets, et que je voudrais bien ne pas avoir à recoder le produit à chaque fois.

    J'ai bien pensé à coder ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<class R, class T> Matrix<T> operator*(const Matrix<R> &matrice1, const Matrix<T> &matrice2){...}
    template<class R, class T> Matrix<T> operator*(const R &scalaire, const Matrix<T> &matrice){...}
    Mais rien ne va :
    - je ne peux pas retourner un objet de type Matrix puisque la classe est abstraite
    - s'il n'y avait pas de problème de retourner un objet Matrix, ferait-il appel à la bonne fonction quand je lui demande A*A ?

    Bref je suis paumé... Quelqu'un pour m'aider ?
    D'avance merci.

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu es dans le très rare cas particulier où héritage et sémantique de valeur (FAQ ?) se croisent, et où ce peut être pertinent.

    Regardes les signatures de ces opérateurs par Blitz++ (vu qu'ils l'ont déjà fait).
    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...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Paf dans les dents !
    Bon je dis ça parce que ta réponse a le mérite de m'impressionner !!...

    Comme tu l'avais senti (j'imagine que c'est le sens de ta référence à la FAQ), le terme "sémantique de valeur" ne m'était guère familier ... Même si j'ai un peu de mal à comprendre pourquoi je suis dans ce cas là, ça ne me dérange pas plus que ça... J'ai l'impression de sortir de chez le toubib et que tu as mis un nom de maladie sur mes symptômes... Ça ne guérit pas mais ça soulage déjà !

    J'ai regardé du côté de chez Blitz++, et j'ai l'impression qu'ils n'ont qu'un seul type pour les tableaux, Array, qu'ils soient de dimension 1 ou 2, là où moi j'ai deux types différents. Ce qui permettrait à l'opérateur * d'être un opérateur interne à la classe (puisqu'un produit de deux éléments parmi scalaire, vecteur ou matrice, est un scalaire, un vecteur ou une matrice). Ce n'est pas tout à fait ce sur quoi j'étais parti, mais ça a le mérite de me plaire...

    Je pense que je vais essayer coder dans ce sens.
    Encore merci de ta réponse.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/05/2011, 17h37
  2. Réponses: 1
    Dernier message: 22/08/2007, 15h48
  3. Réponses: 2
    Dernier message: 05/07/2007, 14h24
  4. Réponses: 6
    Dernier message: 29/11/2006, 11h56
  5. Créer un type matrice avec des templates
    Par souading3000 dans le forum C++
    Réponses: 2
    Dernier message: 15/06/2006, 11h24

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