2011-09-22 16 views
5

के साथ कॉपी-एंड-स्वैप मुहावरे, मैं कॉपी-एंड-स्वैप मुहावरे के बारे में interesting things पढ़ता हूं। मेरा प्रश्न किसी अन्य वर्ग से विरासत में मिलने पर swap विधि के कार्यान्वयन से संबंधित है।विरासत

class Foo : public Bar 
{ 
    int _m1; 
    string _m2; 
    .../... 
public: 
    void swap(Foo &a, Foo &b) 
    { 
     using std::swap; 

     swap(a._m1, b._m1); 
     swap(a._m2, b._m2); 
     // what about the Bar private members ??? 
    } 
    .../... 
}; 

उत्तर

9

आप subobjects स्वैप जाएगा Bar के लिए स्वैप फ़ंक्शन, यदि std::swap नौकरी नहीं करता है। यह भी ध्यान रखें कि swap एक गैर-सदस्य होना चाहिए (और यदि आवश्यक हो तो एक दोस्त)।

+0

ठीक है, धन्यवाद, मैं कलाकारों की कोशिश की, लेकिन मैं 'Bar' बजाय' बार और का इस्तेमाल किया '... – gregseth

+0

कास्टिंग बचने के लिए आप क्या कर सकते हैं "बार और a_bar = ए, और बी_बार = बी; स्वैप (a_bar, b_bar);" –

2

बस बाहर आधार पर निर्भर यह डाली और जाने संकलक यह काम:

swap(static_cast<Bar&>(a), static_cast<Bar&>(b)); 

आप को लागू करने की आवश्यकता हो सकती है:

swap(static_cast<Bar&>(a), static_cast<Bar&)(b));

0

आप आमतौर पर इस तरह यह कर किया जाएगा:

class Foo : public Bar 
{ 
    int _m1; 
    string _m2; 
    .../... 
public: 
    void swap(Foo &b) 
    { 
     using std::swap; 

     swap(_m1, b._m1); 
     swap(_m2, b._m2); 
     Bar::swap(b); 
    } 
    .../... 
}; 
+0

उस मामले को छोड़कर जहां 'बार' 'बार :: स्वैप (बार और बी) लागू नहीं करता है। और मैंने जो लिंक आंतरिक/बाहरी विधि के बारे में पोस्ट किया है उसे देखें। – gregseth

+0

ठीक है, आपकी विधि को स्थैतिक या मित्र घोषित नहीं किया गया था, इसलिए यह मुझे भ्रमित कर दिया, लेकिन मैंने लिंक नहीं पढ़ा ताकि मेरी गलती हो। –

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