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 :
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 ?
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 // ...
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 :
Mais rien ne va :
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){...}
- 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.
Partager