La racine du mal, c'est que tu fais faire trop de choses à ta fonction de multiplication.
Tu devrais avoir d'autres constructeurs pour ta matrice, en particulier un qui prenne comme argument le nombre de lignes et de colonnes et qui se charge de l'allocation de la mémoire (sur une seule ligne, faisons simple):
CMatrice (unsigned l, unsigned c) : lignes(l), colonnes(c), pmat(new double[l*c]) {}
Encore mieux, ta classe CMatrice devrait contenir un std::vector qui se charge pour toi de la gestion de la mémoire.
CMatrice (unsigned l, unsigned c) : lignes(l), colonnes(c) { vecmat.resize(l*c, 0); } // vecteur de taille l*c initialisé à 0
Et un accesseur at(unsigned, unsigned):
1 2
| double& CMatrice::at(unsigned i, unsigned j) { return vecmat[i*colonnes+j); }
double CMatrice::at(unsigned i, unsigned j) const { return vecmat[i*colonnes+j); } // n'oublions pas la version const |
Donc:
1 2 3 4 5 6 7 8 9 10 11 12 13
| CMatrice CMatrice::operator*(const CMatrice& mat) {
// on se débarrasse d'abord du cas particulier, cela rend le code plus lisible
if (this->colonnes != mat.lignes) return CMatrice(); // le mieux serait plutôt une exception je pense
CMatrice resultat(this->lignes, mat.colonnes);
for (int i = 0; i < resultat.lignes; i++) {
for (int j = 0; j < resultat.colonnes; j++) {
for (int k = 0; k < mat.lignes; k++) {
resultat.at(i,j) += this->at(i,k) * mat.at(k,j);
}
}
}
return resultat;
} |
Après bien sûr c'est à polir, lignes et colonnes devraient être des fonctions, etc... Et surtout l'opérateur de multiplication devrait être extérieur à la classe, pas sa méthode.
Partager