2010-09-21 7 views
5

I have 2 classes qui représentent une matrice:
1. RegularMatrix - O (n^2) la représentation
2. Matrice Creuse - une matrice qui est représenté en tant que liste liée (sans zéros).opèrateur commutative surcharge + de 2 objets différents

permet de dire que j'ai:

RegularMatrix a; 
SparseMatrix b; 

je veux être en mesure de le faire:

a+b; 

et aussi:

b+a; 

donc je suis surcharger l'opérateur +. Ma question est, puisque je veux que l'addition soit commutative (a + b = b + a), dois-je implémenter 2 surcharges, une pour chaque cas?

RegularMatrix operator+(const RegualarMatrix &, const SparseMatrix &); 
RegularMatrix operator+(const SparseMatrix & ,const RegualarMatrix &); 

ou existe-t-il une forme générale que le compilateur décide lui-même?

Merci

Répondre

6

Oui, vous avez besoin des deux versions. Mais vous pouvez transférer l'un à l'autre, si l'opération est vraiment commutative

RegularMatrix operator+(const SparseMatrix &a, const RegualarMatrix &b) { 
    return b + a; 
} 
+3

Oui. Sûr. Sneak dans quelques secondes devant moi. Comme vous avez vraiment besoin des points ... – dmckee

+0

Merci .. Et encore une chose que je suis curieux de savoir, est-ce considéré comme une meilleure programmation pour renvoyer une référence de RegularMatrix que de retourner l'objet par valeur? –

+0

@dmckee: Pour être juste, c'était plus d'une minute. ':)' – sbi

0

Les deux versions sont nécessaires, il suffit d'écrire après la première surcharge:

RegularMatrix operator+(const SparseMatrix &a, const RegualarMatrix &b) 
{ 
    return operator+(b,a); 
} 

ou une version plus simple:

RegularMatrix operator+(const SparseMatrix &a, const RegualarMatrix &b) 
{ 
    return b + a; 
} 
Questions connexes