2012-10-09 15 views
21

クラスの<<演算子をオーバーライドしようとしています。目的は基本的に私のクラスのためにのような振る舞いを実装することです、それでそれをcoutに送ることは有用な出力を生成します。ダミーの例を使って、私は以下のコードを持っています。私がコンパイルしようとすると、ぼんやりとしたエラーが表示されます。C++演算子の複数の定義<<

$ 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; 
} 

答えて

33

あなたは一つの定義を破壊していますルール。クイック・フィックスは、次のとおり

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;を除去します。
+0

*:* 'CRectangle'と'過負荷<< 'における上記別のクラス定義が存在する場合'CRectangle'の' << 'を使用すると問題が発生します。 CRectangleの宣言をしても!どんな考え? – Paschalis

10

あなたはそれはあなたがすべてのオブジェクトモジュールでoperator<<を定義した=>(一つの定義規則に違反し、すべての翻訳単位に表示されることを意味し.hファイル、内の関数の定義を入れて、そうしていますリンカーはどちらが「正しい人」であるかを知らない)。

あなたがいずれかを実行できます。.hファイルで

  • 書き込みあなたのオペレータのちょうど宣言(すなわちそのプロトタイプ)とrectangle.cpp
  • にその定義を移動operator<<inline作る - inline機能が許可されているがすべての定義が同一である限り、複数回定義することができます。メンバー定義の場合

(また、あなたが含まれてのヘッダガードを使用する必要があります。)

関連する問題