2012-05-01 13 views
7

सब ठीक था जब तक कि मैंने अपनी ऑब्जेक्ट्स को नामस्थान में स्थानांतरित नहीं किया। और अब संकलक का दावा है कि मेरे रंग गुण निजी हैं।सी ++ - ओस्ट्रीम, दोस्तों और नामस्थान

मैंने सोचा कि दोस्तों का पूरा बिंदु कक्षा वर्गों के साथ encapsulated जानकारी साझा करना था।

Color.h

friend ostream & operator << (ostream& output, const st::Color& color); 

Color.cpp:

ostream & operator <<(ostream& output, const st::Color& color) { 

    output << "Colors:\nalpha\t: " << color.a << "\nred\t: " << color.r << "\ngreen\t: " << color.g 
      << "\nblue\t: " << color.b << "\nvalue\t: " << color.color(); 

    return output; 
} 

त्रुटि:

Color.h||In function 'std::ostream& operator<<(std::ostream&, const st::Color&)':| 
Color.h|52|error: 'unsigned char st::Color::a' is private| 
Color.cpp|15|error: within this context| 
Color.h|49|error: 'unsigned char st::Color::r' is private| 
Color.cpp|15|error: within this context| 
Color.h|51|error: 'unsigned char st::Color::g' is private| 
Color.cpp|15|error: within this context| 
Color.h|50|error: 'unsigned char st::Color::b' is private| 
Color.cpp|16|error: within this context| 
||=== Build finished: 8 errors, 0 warnings (0 minutes, 1 seconds) ===| 

तो सौदा क्या है? मैं अपने आईडीई के रूप में कोड :: ब्लॉक का उपयोग कर रहा हूं। और जब मैं "रंग" पैरामीटर पर डॉट ऑपरेटर का उपयोग करता हूं तो यह किसी भी गुण या विधियों को भी नहीं दिखाएगा। यह स्पष्ट रूप से कुछ गलत होने का संकेत है ... कहीं।

मैंने मित्र ऑपरेटर को अधिभारित कर लिया है और यह ठीक है। कहीं और त्रुटि नहीं है। क्या देता है?

यह इस प्रकार के रूप में घोषित किया गया:

namespace st{ 

class Color { 

    friend ostream & operator << (ostream& output, const st::Color& color); 
public: 
    .... 
private: 
    ..... 

}; 
}; 

संपादित करें:

मेरी सीपीपी में अब मेरे द्वारा की गई इस:

namespace st{ 
ostream & st::operator <<(ostream& output, const st::Color& color) { 

    output << "Colors:\nalpha\t: " << color.a << "\nred\t: " << color.r << "\ngreen\t: " << color.g 
      << "\nblue\t: " << color.b << "\nvalue\t: " << color.color(); 

    return output; 
} 
} 

st::Color::Color() { 

    reset(); 
} 

st::Color::Color(const Color& orig) { 

    a = orig.a; 
    r = orig.r; 
    g = orig.g; 
    b = orig.b; 
} 

void st::Color::reset() { 
    a = 0; 
    r = 0; 
    g = 0; 
    b = 0; 
} 
... etc 
} 

कोई त्रुटि नहीं संकलन, लेकिन यह एक ऐसी के लिए सामान्य है शीर्षलेख में नामस्थान का फिर से उपयोग करने की स्थिति? या यह पूरी तरह से बंद है जो मुझे करना चाहिए?

संपादित करें: @Rob आपके इनपुट के लिए भी धन्यवाद!

+0

आप "एक नाम स्थान के लिए अपने वस्तुओं ले जाया गया" से क्या मतलब है? – jedwards

+0

किसी ऑब्जेक्ट के बीच ऑब्जेक्ट को स्थानांतरित करना। आईई नेमस्पेस सेंट {वर्ग ...} – Sidar

+0

'ऑपरेटर <<' की परिभाषा में नामस्थान का फिर से उपयोग न करें। यह जरूरी नहीं होना चाहिए। – pmr

उत्तर

5

आपको ऑब्जेक्ट के समान नामस्थान में अपने ऑपरेटरों को घोषित और परिभाषित करने की आवश्यकता है। वे अभी भी Argument-Dependent-Lookup के माध्यम से पाए जाएंगे।

एक सामान्य कार्यान्वयन इस तरह दिखेगा:

/// header file 
namespace foo { 
    class A 
    { 
    public: 
    A(); 

    private: 
    int x_; 
    friend std::ostream& operator<<(std::ostream& o, const A& a); 
    }; 

    std::ostream& operator<<(std::ostream& o, const A& a); 
} // foo 

// cpp file 
namespace foo { 
    A::A() : x_(23) {} 

    std::ostream& operator<<(std::ostream& o, const A& a){ 
    return o << "A: " << a.x_; 
    } 
} // foo 


int main() 
{ 
    foo::A a; 
    std::cout << a << std::endl; 
    return 0; 
} 

संपादित

ऐसा लगता है कि आप नाम स्थान में अपने operator<< declarin नहीं कर रहे हैं और यह भी नाम स्थान के बाहर यह परिभाषित कर रहे हैं। मैंने कोड समायोजित किया है।

+0

कृपया उस पर विस्तृत करें। कोई उदाहरण? अभी तक मित्र को नामस्थान सेंट में घोषित किया गया है। यह रंग वर्ग के भीतर घोषित किया गया है। – Sidar

+0

@ सिडर मैंने एक उदाहरण जोड़ा। आप अपनी समस्या दिखाने के लिए अपने प्रश्न में कोड जोड़ना चाह सकते हैं। – pmr

+1

मैं उलझन में हूं, मैंने सोचा कि यह वही है जो मैं कर रहा हूं। घोषणा सीपीपी फ़ाइल में सेट की गई है जबकि परिभाषा हेडर में है। यह आपके उदाहरण से अलग कैसे है? मुझे वास्तव में पता नहीं है कि और क्या दिखाना है। यह वास्तव में सब कुछ है। – Sidar

0

आपको अपने ऑपरेटर को नामस्थान के साथ भी अर्हता प्राप्त करने की आवश्यकता है। यह नाम स्थान में घोषित एक फ़ंक्शन हस्ताक्षर है ताकि उसके प्रतीक तक पहुंचने के लिए आपको नामस्थान के साथ इसे उपसर्ग करने की आवश्यकता हो।

इस तरह यह प्रयास करें:

namespace st { 

    ostream & operator <<(ostream& output, const Color & color) { 

     output << "Colors:\nalpha\t: " << color.a 
       << "\nred\t: " << color.r 
       << "\ngreen\t: " << color.g 
       << "\nblue\t: " << color.b 
       << "\nvalue\t: " << color.color(); 

     return output; 
    } 
} 
+0

मुझे फेंकता है: त्रुटि:' std :: ostream & st :: ऑपरेटर << (std :: ostream &, const st :: color &) 'को' st 'के अंदर घोषित किया जाना चाहिए था ' – Sidar

+0

आप किस कंपाइलर का उपयोग कर रहे हैं? यह विजुअल स्टूडियो एक्सप्रेस 2010 में काम करता है। यदि यह काम नहीं करता है तो काम करने के लिए निश्चित है कि विधि के शरीर को नाम फ़ाइल ब्लॉक के अंदर एच फ़ाइल में डालना है। – Rob

+0

जीसीसी मैंने क्या किया। (मेरे संपादन को देखो) तो हेडर में फिर से नामस्थान सेंट {} का उपयोग करना बिल्कुल ठीक होगा, और केवल ऑपरेटर को अधिभारित कर देगा? मुझे लगता है कि मैं इस सूचना पर छूट गया पर। बाकी सब कुछ सिर्फ सेंट :: रंग :: आदि के साथ scoped है। – Sidar

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