2009-11-05 7 views
6

चूंकि कक्षा दोस्ती को सी ++ में विरासत में नहीं मिला है, तो "नकली" का सबसे अच्छा तरीका क्या है?सी ++ में दोस्ती का पालन करना?

मैं मित्र वर्ग के निजी इंटरफेस को प्राप्त करने के बारे में सोच रहा था, जो विरासत में प्राप्त बेस-क्लास में संरक्षित तरीकों के माध्यम से है, लेकिन इसके परिणामस्वरूप दो बार एक ही इंटरफ़ेस लिखना और बनाए रखना है।

क्या कोई और तरीका है?

उत्तर

6

कुंजी का उपयोग एक संभावित समाधान है।

विचार केवल यदि आप एक कुंजी है कि आप संचालन अनलॉक कर सकते हैं है ... लेकिन एक उदाहरण गोता तो चलो शब्द पर हजारों के लायक है:

// Step 1: The key 
class NeedAccess; 

namespace details { class Key { friend NeedAccess; Key() {} }; } 

// Step 2: NeedAccess 
class NeedAccess 
{ 
protected: 
    static details::Key GetKey() { return details::Key(); } 
}; 

// Step 3: The big one 
class BigOne 
{ 
public: 
    void lockedMethod(details::Key); 
}; 

कुंजी जा रहा है नकल के मामले constructable चर्चा पर निर्भर है। मैं नहीं देखता कि इसे रोकने से आप क्या हासिल कर सकते हैं।

एक और लाभ यह है कि आप जिस विधि को एक्सेस करना चाहते हैं, उसके आधार पर आप कई चाबियाँ प्राप्त कर सकते हैं, इस तरह आप 'आंशिक' दोस्ती देते हैं, और आपके 'आंशिक' दोस्त आपके निजी भागों के साथ गड़बड़ नहीं कर सकते हैं, प्रसिद्ध दावा!

संपादित:

इस विधि लिमिटेड मैत्री कहा जाता है, और comp.lang.c++.moderated पर चर्चा की गई।

Private Interface की तुलना में इस विधि का मुख्य लाभ ढीला युग्मन है, क्योंकि केवल आगे की घोषणा आवश्यक है।

+0

के बाद से 'Key' एक खाली वर्ग है, यह वास्तव में किसी भी ढेर-wize/स्मृति-wize प्रभाव हो रहा है या जो संकलक यह के रूप में केवल" वाक्यात्मक चीनी "का इलाज करता है? – sold

+2

एक खाली वर्ग अभी भी कुछ 'वजन' करता है (कम से कम एक बाइट मूल्य डेटा, अक्सर अधिक संरेखण मुद्दों के कारण)। एम्स्ट बेस ऑप्टिमाइज़ेशन नामक एक अनुकूलन है, जिसमें इस ओवरहेड को रोकने से बचने के लिए खाली कक्षा से विरासत में शामिल होना शामिल है। इस प्रकार आप 'KeyAccess 'को' कुंजी 'से निजी रूप से विरासत में प्राप्त करना चुन सकते हैं और प्रतिलिपि के बजाय संदर्भ वापस कर सकते हैं ... लेकिन एक संदर्भ भी' वजन 'करता है। आपके उदाहरण के लिए –

0

सुनिश्चित नहीं हैं कि अगर यह नहीं है कि आपको पहले से बारे में सोच रहे हैं, लेकिन यहां एक Virtual Friend उदाहरण है

2

frinedship साथ वर्ग के बच्चों को उनके लिए पहुँच करने के लिए वहाँ माता पिता लिए कहना होगा।

class CrustyNeighbour 
{ 
    private: 
     friend class Bob; 
     void useWiFi(std::string const& data); 
}; 

class Bob 
{ 
    protected: 
     useWifi(CrustyNeighbour& neighbour,std::string const& data) 
     { neighbour.useWiFi(data);} 
}; 

class Mary: public Bob // Bob's offspring 
{ 
    void playHalo(WifiOwner& owner) // WifiOwner derived from CrustyNeighbour 
    { 
     useWifi(owner,gameData); // use wifi via his/her parent who access to eighbours wifi 
    } 
}; 
+0

+1। :-) – Tenner

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