クラスの_<<
_演算子をオーバーライドしようとしています。目的は基本的に、私のクラスにtoString()
のような動作を実装することであり、それをcout
に送信すると有用な出力が生成されます。ダミーの例を使用して、私は以下のコードを持っています。コンパイルしようとすると、次のエラーが発生します。
_$ 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
_
なぜこれが起こっているのか理解できません。私のコードは以下です:
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;
}
_
1つの定義ルールを破っています。クイックフィックスは:
inline ostream& operator<<(ostream& out, const CRectangle& r){
return out << "Rectangle: " << r.x << ", " << r.y;
}
その他は次のとおりです。
Rectangle.cpp
ファイルに移動します。。
class CRectangle {
private:
int x, y;
public:
void set_values (int,int);
int area ();
friend ostream& operator<<(ostream& out, const CRectangle& r){
return out << "Rectangle: " << r.x << ", " << r.y;
}
};
ボーナス:
using namespace std;
を削除します。関数のdefinitionを.h
ファイルに入れています。つまり、すべての翻訳単位に表示され、1つの定義ルールに違反します(=>定義したoperator<<
すべてのオブジェクトモジュールで、リンカはどちらが「正しいものか」を知りません。
次のいずれかを行うことができます。
rectangle.cpp
に移動しますoperator<<
inline
-inline
関数は、すべての定義が同一である限り、複数回定義することができます。(また、インクルードではヘッダーガードを使用する必要があります。)