2011-11-10 20 views
9

इस तरह की एक नेस्टेड निजी कक्षा के लिए ऑपरेटर < < कैसे अधिभारित कर सकता है?ओवरलोडिंग ऑपरेटर << एक नेस्टेड निजी कक्षा के लिए संभव है?

class outer { 
    private: 
    class nested { 
     friend ostream& operator<<(ostream& os, const nested& a); 
    }; 
    // ... 
}; 

जब बाहरी वर्ग संकलक के बाहर की कोशिश कर रहा गोपनीयता के बारे में शिकायत:

error: ‘class outer::nested’ is private 

उत्तर

13

आप operator<<outer के एक दोस्त के रूप में अच्छी तरह से कर सकता है। या फिर आप इसे लागू कर सकता है पूरी तरह से nested में inline, जैसे:

class Outer 
{ 
    class Inner 
    { 
     friend std::ostream& 
     operator<<(std::ostream& dest, Inner const& obj) 
     { 
      obj.print(dest); 
      return dest; 
     } 
     // ... 
     // don't forget to define print (which needn't be inline) 
    }; 
    // ... 
}; 
+0

और वें ई प्रिंट फ़ंक्शन एक 'const' सदस्य फ़ंक्शन होना चाहिए। यदि यह 'std :: ostream और print (std :: ostream & out) const' है, तो 'ऑपरेटर <<' केवल एक पंक्ति हो सकती है: 'वापस obj.print (dest);'। – Nawaz

+0

क्यों std: ostream इनर का मित्र होना चाहिए? – Mordachai

+1

क्योंकि आप इसे अन्यथा 'इनर' में परिभाषित नहीं कर सकते हैं। (और यदि इसे 'इनर' में परिभाषित नहीं किया गया है, तो आपको समस्या है कि यह 'इनर' तक नहीं पहुंच सकता है, क्योंकि 'इनर'' बाहरी 'का निजी सदस्य है।) –

6

आप दो अलग अलग फाइल में एक ही बात चाहते हैं (hh, सीपीपी) आप दोस्त को दो समय का पालन समारोह है:

hh:

// file.hh 
class Outer 
{ 
    class Inner 
    { 
     friend std::ostream& operator<<(std::ostream& dest, Inner const& obj); 
     // ... 
    }; 

    friend std::ostream& operator<<(std::ostream& dest, Outer::Inner const& obj); 
    // ... 
}; 

सीपीपी:

// file.cpp: 
#include "file.hh" 

std::ostream &operator<<(std::ostream& dest, Outer::Inner const& obj) 
{ 
    return dest; 
}