Probleme de redéfinition d'operateur << et +
croco57
-
moreno -
moreno -
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;
}
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;
}
A voir également:
- Probleme de redéfinition d'operateur << et +
- Opérateur de réseau mobile - Guide
- 0785 quel operateur ✓ - Forum Mobile
- 06 44 67 quel opérateur - Forum Mobile
- 0758 quel opérateur - Forum Opérateurs & Réseaux mobiles
- 0466 quel opérateur - Forum Mobile
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..
‘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..
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
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
Avec un opérateur dyadique, tu passes un seul paramètre.
Bonne soirée.
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