कुंजी का उपयोग एक संभावित समाधान है।
विचार केवल यदि आप एक कुंजी है कि आप संचालन अनलॉक कर सकते हैं है ... लेकिन एक उदाहरण गोता तो चलो शब्द पर हजारों के लायक है:
// 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 की तुलना में इस विधि का मुख्य लाभ ढीला युग्मन है, क्योंकि केवल आगे की घोषणा आवश्यक है।
स्रोत
2009-11-05 15:52:05
के बाद से 'Key' एक खाली वर्ग है, यह वास्तव में किसी भी ढेर-wize/स्मृति-wize प्रभाव हो रहा है या जो संकलक यह के रूप में केवल" वाक्यात्मक चीनी "का इलाज करता है? – sold
एक खाली वर्ग अभी भी कुछ 'वजन' करता है (कम से कम एक बाइट मूल्य डेटा, अक्सर अधिक संरेखण मुद्दों के कारण)। एम्स्ट बेस ऑप्टिमाइज़ेशन नामक एक अनुकूलन है, जिसमें इस ओवरहेड को रोकने से बचने के लिए खाली कक्षा से विरासत में शामिल होना शामिल है। इस प्रकार आप 'KeyAccess 'को' कुंजी 'से निजी रूप से विरासत में प्राप्त करना चुन सकते हैं और प्रतिलिपि के बजाय संदर्भ वापस कर सकते हैं ... लेकिन एक संदर्भ भी' वजन 'करता है। आपके उदाहरण के लिए –