Probleme de redéfinition d'operateur << et +

Fermé
croco57 - 20 juin 2009 à 17:31
 moreno - 9 déc. 2010 à 15:10
Bonjour,
j'ai un probleme pour redefinir l'operateur << et +

voici le code

#include <iostream>
#include <string>
#include <vector>

#include <stdlib.h>
#include <math.h>

//#include "/home/superpc/Documents/prog/cpp/osdefine.h"
//#include std_IO_h

using namespace std;

class Row
{
private :
vector<double> columns;
public :
Row()
{
}

Row(int size)
{
for(int i =0;i<size;i++)
{
columns.insert(columns.end(),0.0);
}
}

Row(const Row& aCopy)
{
vector<double> :: const_iterator iter;
for(iter=aCopy.columns.begin();iter!= aCopy.columns.end();iter++)
{
double d = (*iter);
columns.insert(columns.end(),d);
}
}

int size()
{
return columns.size();
}

double& operator[] (int index)
{
if(index<0|| index > columns.size())
{
throw "class Row : errAcess : indice du taleau hors limite";
}
return columns[index];
}
};

class Matrix
{
private :
vector<Row> rows;
public :
Matrix(int lign, int cols)
{
for(int i=0;i<lign;i++)
{
Row r(cols);
rows.insert(rows.end(),r);
}
}

Row& operator[] (int index)
{
if(index<0|| index > rows.size())
{
throw "class Matrix : errAcess : indice du taleau hors limite";
}
return rows[index];
}

std::ostream &operator << (Matrix& m);

int RowCount()
{
return rows.size();
}

int ColumnCount()
{
if(rows.size())
{
return rows[0].size();
}
return 0;
}

const Matrix operator+ (const Matrix m1,const Matrix m2)
{
if(m1.RowCount() != m2.RowCount())
{
throw "class Matrix : errSize : nombre de lignes invalide";
}

if(m1.ColumnCount() != m2.ColumnCount())
{
throw "class Matrix : errSize : nombre de colonnes invalide";
}

Matrix m(m1.RowCount(),m1.ColumnCount());

for(int r=0;r<m1.size();r++)
{
for(int(c=0;c<m1[r].size();c++)
{
m[r][c]=m1[r][c]+m2[r][c];
}
}

return m;
}
};

std::ostream & Matrix::operator << (Matrix &m)
{
std::ostream s <<"";

for(int r=0;r<rows.size();r++)
{
for(int c=0;c<rows[r].size();c++)
{
s<<m[r][c] << " ";
}
s << endl;
}
return s;
}

2 réponses

J'ai évidemment pas lu le code qui n'est pas indenté (donc illisible !!!).
‘const Matrix Matrix::operator+(Matrix, Matrix)’ must take either zero or one argument
Le message du compilateur est explicite: une redéfinition d'un opérateur dans une classe ne peut avoir que zéro ou un argument... et toi tu en mets deux !!!
Tu n'as pas pigé que tu es dans une classe; donc lors de l'appel de l'opérateur, tu le fais avec un objet... donc tu as déjà un argument de connu.
Conclusion: avec un opérateur monadique, tu ne passes pas de paramètres, et avec le opérateur dyadique, tu passes deux paramètres
Bonne continuation..
3
Non, tu t'es trompé:
Avec un opérateur dyadique, tu passes un seul paramètre.
Bonne soirée.
0
croco57 > loupius
21 juin 2009 à 17:24
merci pour ta reponce je vais essayer plus tard
0
tu peux définir ton opérateur + comme friend dans le hpp :
friend const Matrix::operator+(Matrix,Matrix)

puis dans le cpp t'auras pas de "Matrix::" préfixant ta fonction :
const operator+(Matrix m1,Matrix m2)

quand une fonction est friend, elle ne fait pas partie de la classe mais elle a connaissance de tous les champs (privés et publics) de ta classe
0
il me genere le erreur suivate

matrice.cpp:94: erreur: ‘const Matrix Matrix::operator+(Matrix, Matrix)’ must take either zero or one argument
matrice.cpp: In member function ‘std::ostream& Matrix::operator<<(Matrix&)’:
matrice.cpp:122: erreur: expected initializer before ‘<<’ token
matrice.cpp:128: erreur: ‘s’ was not declared in this scope
matrice.cpp:130: erreur: ‘s’ was not declared in this scope
matrice.cpp:132: erreur: ‘s’ was not declared in this scope
2