2012-10-09 57 views
21

मैं कक्षा के लिए << ऑपरेटर को ओवरराइड करने का प्रयास कर रहा हूं। उद्देश्य मूल रूप से toString() को मेरी कक्षा के व्यवहार की तरह लागू करने के लिए है, ताकि इसे cout पर भेजकर उपयोगी आउटपुट उत्पन्न हो सके। एक डमी उदाहरण का उपयोग करके, मेरे पास नीचे कोड है। जब मैं संकलन करने का प्रयास करता हूं, तो मुझे foollowing त्रुटि मिलती है:सी ++ ऑपरेटर की कई परिभाषाएं <<

$ 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

आप एक .h फ़ाइल, जिसका अर्थ है कि यह, हर अनुवाद इकाई में दिखाई देगा एक परिभाषा नियम (उल्लंघन करने => आप हर वस्तु मॉड्यूल में operator<< परिभाषित में एक समारोह के परिभाषा लगा रहे हैं, तो लिंकर नहीं जानता कि कौन सा "सही" है)। - inline कार्यों की अनुमति है

  • लिखने सिर्फ अपने ऑपरेटर (यानी अपने प्रोटोटाइप) ज फ़ाइल में और अपनी परिभाषा के लिए कदम की घोषणाrectangle.cpp
  • -operator<<inline बनाने:

    आप या तो एक बार से अधिक परिभाषित किया जाना चाहिए, जब तक कि सभी परिभाषाएं समान हों।

(इसके अलावा, आप शीर्ष लेख गार्ड का उपयोग करना चाहिए अपने भी शामिल है।)

संबंधित मुद्दे