2010-07-17 11 views
9

मित्र कार्य एक वर्ग के निजी सदस्यों को सही पहुंचने में सक्षम होना चाहिए? तो मैंने यहां क्या गलत किया है? मैंने ऑपरेटर < < के साथ मेरी .h फ़ाइल शामिल की है, मैं कक्षा के साथ मित्रता करने का इरादा रखता हूं।कक्षा के साथ दोस्त लेकिन निजी सदस्यों तक नहीं पहुंच सकते

#include <iostream> 

using namespace std; 
class fun 
{ 
private: 
    int a; 
    int b; 
    int c; 


public: 
    fun(int a, int b); 
    void my_swap(); 
    int a_func(); 
    void print(); 

    friend ostream& operator<<(ostream& out, const fun& fun); 
}; 

ostream& operator<<(ostream& out, fun& fun) 
{ 
    out << "a= " << fun.a << ", b= " << fun.b << std::endl; 

    return out; 
} 

उत्तर

12

यहाँ में ...

ostream& operator<<(ostream& out, fun& fun) 
{ 
    out << "a= " << fun.a << ", b= " << fun.b << std::endl; 

    return out; 
} 

आप

ostream& operator<<(ostream& out, const fun& fun) 
{ 
    out << "a= " << fun.a << ", b= " << fun.b << std::endl; 

    return out; 
} 

(मैं यह कई बार द्वारा बम पर काट लिया गया है की जरूरत है; अपने ऑपरेटर अधिभार की परिभाषा नहीं करता ' टी घोषणा से काफी मेल खाता है, इसलिए इसे एक अलग कार्य माना जाता है।)

+2

यह हास्यास्पद है कि कैसे सबसे simpliest बात सबसे मुश्किल लगता है ... – starcorn

+0

करता है 'मज़ा और' हमेशा के लिए है है 'const' हो? – peter

5

हस्ताक्षर मेल नहीं खाते हैं। आपका गैर-सदस्य फ़ंक्शन मज़ेदार & मज़ेदार लगता है, जिस पर मित्र घोषित किया गया है & मज़ेदार है।

0

आप वर्ग परिभाषा के अंदर दोस्त समारोह परिभाषा लिख ​​कर त्रुटियों के इन प्रकार से बचने कर सकते हैं:

class fun 
{ 
    //... 

    friend ostream& operator<<(ostream& out, const fun& f) 
    { 
     out << "a= " << f.a << ", b= " << f.b << std::endl; 
     return out; 
    } 
}; 

नकारात्मक पक्ष यह है कि operator<< के लिए हर कॉल inlined है, जो कोड ब्लोट को जन्म दे सकता है।

(भी ध्यान रखें कि पैरामीटर fun नहीं कहा जा सकता क्योंकि उस नाम पहले से ही एक प्रकार को दर्शाता है।)

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