2011-01-01 16 views
7

स्वीकार करने के लिए स्क्वायर ब्रैकेट ऑपरेटर ओवरलोडिंग मैं संग्रह कक्षा लिख ​​रहा हूं। मैं संग्रह में तत्वों तक पहुंच प्रदान करने के लिए स्क्वायर ब्रैकेट ऑपरेटर ([]) को अधिभारित करना चाहता हूं।मूल्य

int operator[](int i) 
{ 
    // Do stuff here 
} 

मेरे समस्या यह है कि मैं देख नहीं है कि यह कैसे लिखने के लिए इतना है कि मैं एक मूल्य के स्वीकार करने के लिए इस ऑपरेटर का उपयोग कर सकते हैं:

myClassInstance[0] = value; 

मैं के साथ वर्ग कोष्ठक ऑपरेटर घोषित करने के लिए कोई रास्ता नहीं देख एक अतिरिक्त तर्क (तत्व को असाइन करने के लिए मूल्य)।

मुझे पता है कि मैं आसानी से int & वापस कर सकता हूं और कॉलर उस पर एक मान निर्दिष्ट कर सकता है, लेकिन आंतरिक रूप से प्रत्येक तत्व को सार्वजनिक किए गए प्रारूप की तुलना में एक अलग प्रारूप में संग्रहीत किया जाता है।

क्या यह भी संभव है?

+0

आप दो ऑपरेटर [] (int) संस्करणों की जरूरत है। एक कॉन्स संस्करण और गैर-कॉन्स संस्करण जिसे आपने पूछा था। एक मूल वस्तु को कॉल करने के लिए मूल संस्करण को इसके पीछे होना चाहिए; –

+0

@ एडविन: मैंने आपकी दूसरी टिप्पणी देखी। मैं इसे जाने दूंगा। धन्यवाद। –

उत्तर

9

int_proxy कक्षा लिखें जो पूरी तरह से int पर परिवर्तनीय है और int से असाइन करने योग्य है।

operator int(); 
int_proxy& operator=(int); 

इस प्रॉक्सी कक्षा में, दुकान जो भी जानकारी आप निकालते हैं और कंटेनर में मूल्य निर्धारित करने में सक्षम होने की जरूरत है: आप कम से कम दो सदस्य कार्यों की आवश्यकता होगी। रूपांतरण ऑपरेटर में पुनर्प्राप्ति और असाइनमेंट ऑपरेटर में असाइनमेंट करें।

+1

आप यह उल्लेख करना भूल गए हैं कि मूल int ऑपरेटर [] (int) में एक कॉन्स्ट संशोधक होना चाहिए, जो इसे कॉन्स्ट ऑब्जेक्ट्स पर कॉल करने की अनुमति देता है। –

+0

सोच रहा था कि मैं इससे अधिक आसानी से ऐसा कर सकता हूं। लेकिन ऐसा नहीं लगता है। धन्यवाद! –

+0

@ एडविन: क्या इसे बनाने का कोई तरीका है ताकि कोई '[] 'का उपयोग करके' कॉन्स्ट 'ऑब्जेक्ट पढ़ सके, और दोनों एक ही ऑपरेटर का उपयोग करके एक गैर-कॉन्स्ट ऑब्जेक्ट को पढ़ और लिखते हैं? – supercat

2

किसी ऐसे ऑब्जेक्ट का संदर्भ दें जिसमें ऑपरेटर है = जो उस int को सामान दे सकता है जहां उसे जाना है। एक उदाहरण के लिए एसटीएल में बूलियन वेक्टर ट्रिकरी को देखें, यदि आवश्यक रूप से एक शानदार अनुकरणीय उदाहरण नहीं है।