c++ multiples définitions de l'opérateur<<
Je cherche à remplacer le <<
opérateur pour une classe. Le but est essentiellement de mettre en œuvre un toString()
comme le comportement de ma classe, de sorte que de l'envoyer à cout
produira une sortie utile. À l'aide d'un mannequin exemple, j'ai le code ci-dessous. Lorsque j'essaie de compiler, j'ai le foollowing erreur:
$ g++ main.cpp Rectangle.cpp
/tmp/ccWs2n6V.o: In function `operator<<(std::basic_ostream<char, std::char_traits<char> >&, CRectangle const&)':
Rectangle.cpp:(.text+0x0): multiple definition of `operator<<(std::basic_ostream<char, std::char_traits<char> >&, CRectangle const&)'
/tmp/ccLU2LLE.o:main.cpp:(.text+0x0): first defined here
Je ne peux pas comprendre pourquoi ce qui se passe. mon code est ci-dessous:
Rectangle.h:
#include <iostream>
using namespace std;
class CRectangle {
private:
int x, y;
friend ostream& operator<<(ostream& out, const CRectangle& r);
public:
void set_values (int,int);
int area ();
};
ostream& operator<<(ostream& out, const CRectangle& r){
return out << "Rectangle: " << r.x << ", " << r.y;
}
Rectangle.cpp:
#include "Rectangle.h"
using namespace std;
int CRectangle::area (){
return x*y;
}
void CRectangle::set_values (int a, int b) {
x = a;
y = b;
}
main.cpp:
#include <iostream>
#include "Rectangle.h"
using namespace std;
int main () {
CRectangle rect;
rect.set_values (3,4);
cout << "area: " << rect.area();
return 0;
}
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la rupture de la une définition de la règle. Un quick-fix est:
Autres sont:
Rectangle.cpp
fichier..
Bonus:
using namespace std;
de l'en-tête.CRectangle
et dans leoverload<<
il utilise le<<
deCRectangle
puis il y a des problèmes. Même dans le cas d'une déclaration anticipée deCRectangle
! Aucune idée pourquoi?Vous de mettre les définition d'une fonction dans un
.h
fichier, ce qui signifie qu'il apparaîtra dans chaque unité de traduction, en violation de l'Une Définition de la Règle (=> vous avez définioperator<<
dans chaque module d'objet, de sorte que l'éditeur de liens ne sais pas qui est "le bon").Vous pouvez soit:
rectangle.cpp
operator<<
inline
-inline
fonctions peuvent être définies plus d'une fois, tant que toutes les définitions sont identiques.(Vous pouvez également utiliser l'en-tête des gardes dans votre comprend.)