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
    Membre averti
    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
    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 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
    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
    Membre averti
    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
    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