2011-12-04 14 views
10

मैं अपने वर्गों में से एक में ऑपरेटर < < अधिभारित करना चाहता हूं। हस्ताक्षर इस प्रकार है:सी ++ - क्या हेडर फाइल में मित्र कार्यों को परिभाषित किया जाना चाहिए?

friend std::ostream& operator<<(std::ostream& os, const Annuaire& obj) 

जब मैं सीपीपी में परिभाषित फ़ाइल यह कहना है कि ऑपरेटर < < वास्तव में 1 तर्क लेता हालांकि, जब मैं ज में यह परिभाषित करने की कोशिश, उसे कंपाइल /ठीक काम करता है।

std::ostream& Annuaire::operator<<(std::ostream& os, const Annuaire& obj){ // ... } 

यह हेडर फाइल में परिभाषित किया जा करने की जरूरत के दोस्त कार्यों से कोई लेना देना है:

यह मैं इसे कैसे .cpp फ़ाइल में परिभाषित है?

+0

आप 'पाने के लिए ostream' और' istream' सही है ... –

+0

हाँ, अपने दोस्त IStream है और सीपीपी में से एक है, ostream यह है कि अगर जानबूझकर है आप 2 दोस्त घोषणाओं और 2 परिभाषाएँ की आवश्यकता होगी है यदि नहीं, तो –

+0

स्ट्रीम में या बाहर स्ट्रीम करना चाहते हैं, तो एक या दूसरे को ठीक करें, धन्यवाद, यह एक कॉपी-पेस्ट गलती थी। संलग्न नामस्थान पर एक नोट जोड़ने के लिए – Pacane

उत्तर

9

यह एक cpp फ़ाइल में परिभाषित किया जा सकता है, लेकिन यह कम से कम घोषित एक हेडर फाइल में होने की जरूरत है, नहीं तो सब स्थानों पर जहां आप इसे उपयोग करना चाहते हैं केवल होगा वह सामान देखें जो स्ट्रीम स्वयं आपको देता है, न कि आपके अधिभार।

// .h and in class 
friend std::ostream& operator<<(std::ostream& os, MyClass const& v); 

// .cpp 
std::ostream& operator<<(std::ostream& os, MyClass const& v){ 
    // print it 
} 
2

ऐसा कोई प्रतिबंध नहीं; आप शायद इसे गलत लिख रहे हैं। कुछ इस तरह होना चाहिए:

class Foo 
{ 
    int n; 

    friend std::ostream & operator<<(std::ostream &, Foo const &); 
}; 

std::ostream & operator<<(std::ostream & o, Foo const & x) 
{ 
    return o << x.n; 
} 
9

समस्या यह है कि आप इसे परिभाषित कर रहे हैं। यह कक्षा के सदस्य नहीं है, यह कक्षा के दोस्त है। आपको Annuaire:: उपसर्ग ड्रॉप करने की आवश्यकता है। यह करने के लिए

std::ostream& Annuaire::operator<<(std::ostream& os, const Annuaire& obj){ // ... 

: तो, यह बदलने

std::ostream& operator<<(std::ostream& os, const Annuaire& obj){ // ... 

त्रुटि संदेश के लिए कारण यह है कि Annuaire::operator<<(std::ostream& os, const Annuaire& obj) तीन तर्कों उम्मीद होती है: Annuaire उदाहरण है कि उस पर कहा जाता है (this के रूप में) और और दो अतिरिक्त तर्क (os और obj)।

3

मित्र फ़ंक्शन, भले ही कक्षा के अंदर घोषित होने के लिए प्रतीत होता है, सदस्य कार्य नहीं बल्कि नामस्थान स्तर फ़ंक्शन (संलग्न नामस्थान में) हैं। अपने कोड में आप दोस्त समारोह सही ढंग से घोषित है, लेकिन आप वर्ग के एक सदस्य समारोह के रूप में यह परिभाषित करने की कोशिश:

std::ostream& Annuaire::operator<<(std::ostream& os, const Annuaire& obj){ 

यही परिभाषा Annuaire के एक सदस्य समारोह के लिए किया जाएगा, operator<< कहा जाता है, कि दो तर्क लेता है, जो operator<< के रूप में अमान्य है, दो तरीकों से अधिभारित किया जा सकता है: एक मुक्त फ़ंक्शन दो तर्क (बाएं हाथ की ओर और दाएं हाथ की तरफ) लेते हुए या कक्षा के सदस्य फ़ंक्शन के रूप में जो अभिव्यक्ति के एलएचएस में प्रकट होता है rhs प्रकार।

std::ostream& operator<<(std::ostream& os, const Annuaire& obj) 
+0

+1। वास्तविक फ़ंक्शन परिभाषा पर्याप्त नहीं होने से पहले 'नेमस्पेस एक्स' का उपयोग करना' जोड़ने के लिए। – moooeeeep

2

के रूप में डेविड के जवाब में बताया गया, इस मामले में ऑपरेटर एक नहीं है: इस विशेष मामले में, के बाद से एलएचएस std::ostream है और आप इसे संशोधित नहीं कर सकते, तो आप एक नि: शुल्क समारोह का उपयोग करने का एकमात्र विकल्प के साथ छोड़ दिया जाता है सदस्य समारोह, यह एक ही नामस्थान में केवल एक दोस्त का काम है। इसने मुझे एक बहुत ही समान मुद्दे को हल करने में सही दिशा में इंगित किया।

मैं यह उत्तर पोस्ट कर रहा हूं क्योंकि यह मेरे लिए तुरंत स्पष्ट नहीं था। हो सकता है क्योंकि कार्यान्वयन फ़ाइल जहां मैं ऑपरेटर जोड़ रहा था, नामस्थान में पूरी तरह से संलग्न नहीं था, और इसके बजाय उपयोग-निर्देश का उपयोग किया गया था।

प्रासंगिक नहीं होना चाहिए लेकिन मैं VS2013 का उपयोग कर रहा हूं।

//Foo.h 
namespace Bar{ 
    class Foo 
    { 
    public: 
     Foo(); 
    private: 
     int n; 
     friend std::ostream & operator<<(std::ostream &, Foo const &); 
    }; 
} 

//Foo.cpp 
using namespace Bar; //won't apply to the operator definition 
Foo::Foo(){}// doesn't require the Bar qualifier because of the using-directive 

//the operator required the Bar namespace qualifier 
std::ostream & Bar::operator<<(std::ostream & o, Foo const & x) 
{ 
    return o << x.n; 
} 
+0

बिल्कुल मेरी समस्या! मुझे यकीन नहीं है कि यह क्यों हो रहा है। – Flynsee

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

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