2010-03-28 17 views
8

मैंको अधिभारित करना चाहता हूं ताकि सी ++ में char के 2 डी सरणी में आंतरिक पहुंच हो सके।ऑपरेटर [] [] सी ++

अभी मैं केवल operator[] ओवरलोडिंग कर रहा हूँ, जो

class Object 
{ 
    char ** charMap ; 
    char* operator[](int row) 
    { 
     return charMap[row] ; 
    } 
} ; 

ठीक काम करता है की तरह कुछ चला जाता है .. यह हालांकि operator[][] ओवरराइड करने के लिए संभव है?

+8

सी ++ में कोई ऑपरेटर [] [] नहीं है। –

+1

अधिभार द्वारा लौटाए गए सरणी को ओवरलोड करें [] ओएच SHI- –

उत्तर

18

ऐसा करने की कोशिश मत करो। लेकिन यह एक अच्छी बात नहीं है।

इसके विपरीत - यह कार्यान्वयन विस्तार - char* पॉइंटर - बाहरी रूप से बदलकर आपकी कक्षा के छिपाने की जानकारी को अवरुद्ध करता है। सामान्य रूप से, यह सलाह नहीं दी जाती है।

एक बेहतर तरीका operator [,] को लागू करना होगा जो एक से अधिक तर्क लेता है, या वास्तव में operator [][]। लेकिन सी ++ में न तो मौजूद है।

तो सामान्य ऐसा करने का तरीका operator [] को एक से अधिक आयामों के लिए पूरी तरह से मिटाना है। स्वच्छ विकल्प operator() उपयोग करने के लिए है बजाय क्योंकि है कि ऑपरेटर कर सकते हैं एक से अधिक तर्क है:

class Object 
{ 
    char ** charMap ; 
    char& operator()(int row, int column) 
    { 
     return charMap[row][column]; 
    } 
}; 

अधिक जानकारी के लिए C++ FAQ Lite में आलेख देखें।

+2

+1 'ऑपरेटर() ' – missingfaktor

+2

का सुझाव देने के लिए +1 आपका उत्तर कुछ अच्छे अंक उठाता है, लेकिन सहायक ऑपरेटर [] को इंकापुलेशन को नष्ट करने की आवश्यकता नहीं होती है - पॉइंटर लौटने की बजाय, आप एक प्रॉक्सी ऑब्जेक्ट वापस कर सकते हैं जो ऑपरेटर का समर्थन करता है [] किसी भी आंतरिक खुलासा। –

+0

@ जेरी: सच है लेकिन फिर प्रॉक्सी ऑब्जेक्ट काफी अधिक काम है और किसी भी लाभ को बहु-आयामी ऑब्जेक्ट के लिए संदिग्ध है (बेशक, एक * jagged * सरणी के लिए, यह सही समझ में आता है)। –

5

कोई operator[][] नहीं है। a[x][y] का मूल्यांकन पहले operator[]a पर, और उसके बाद operator[] पर फिर से परिणाम देता है।

तो आपके ऑब्जेक्ट के operator[] को अपने ऑब्जेक्ट को अपने operator[] के साथ वापस करना होगा, जो तब अनुरोधित मान तक पहुंच जाएगा।

2

जहां तक ​​मुझे पता है कि operator[][] जैसी कोई चीज़ नहीं है। आप क्या कर सकते हैं यह है कि आप operator[] विधि से वापस लौट सकते हैं जो operator[] ओवरलोड हो गया है।

असल में आप इसे अभी कर रहे हैं, क्योंकि आप char* लौटाते हैं जिसे [] का उपयोग करके अनुक्रमित किया जा सकता है।

17

कोई ऑपरेटर [][] नहीं है: यह दो [] एक पंक्ति में संचालन है। आप:

  • Have Object::operator[] एक पंक्ति, जो अपनी ही operator[] विधि है कि एक स्तंभ संख्या लेता है का प्रतिनिधित्व करने के लिए एक द्वितीय श्रेणी का एक ऑब्जेक्ट प्रदान;
  • get(int row, int column) विधि लिखें और ऑपरेटर ओवरलोडिंग के बजाय इसका उपयोग करें। मैं तब तक इसकी अनुशंसा करता हूं जब तक कि आपके ऑब्जेक्ट को बिल्कुल सरणी की तरह व्यवहार न करना पड़े। operator [] अधिक भार जिस तरह से आप वास्तव में क्या करते मुक्त करने के लिए [][] वाक्य रचना प्रदान करता है के रूप में अन्य लोगों ने कहा, -
+4

+1 यदि आपकी कक्षा किसी फ़ंक्शन की तरह व्यवहार करने का इरादा नहीं है, तो ऑपरेटर() अकेले छोड़ दें। –

0

कोई [][] ऑपरेटर नहीं है। वास्तव में क्या होता है कि दूसरा [] पहले [] द्वारा लौटाए गए चर पर संचालित होता है।क्योंकि पहले से ही उस कार्यक्षमता है, यह [][] ऑपरेटर मौजूद होने के लिए अस्पष्टता पैदा करेगा।


उदाहरण के लिए: मान लीजिए कि आपके पास T किसी प्रकार के x है।

T x = new T(); 

अगर हम [] ऑपरेटर का उपयोग, मान लें कि अन्य प्रकार Q के एक चर दिया जाता है करते हैं:

Q y = x[0]; 

और फिर प्रकार Q के एक चर पर [] ऑपरेटर का उपयोग प्रकार के एक चर वापस कर सकती है R:

R z = y[0]; 

इसलिए x[][] टी के एक चर रिटर्न

S a = x[0][0]; 

संकलक जानने का कोई तरीका होता है, तो उस पर [][] ऑपरेटर का उपयोग करना चाहिए: ype आर

चलो कहते हैं कि हम वास्तव में प्रकार टी के लिए [][] ओवरलोड इस तरह है कि यह एक प्रकार S लौटे सक्षम थे चलो x एक प्रकार S वैरिएबल लौटने के लिए, या [] ऑपरेटर को एक प्रकार में दो बार R परिवर्तनीय लौटने के लिए उपयोग करें। यह उपरोक्त वर्णित अस्पष्टता है।


आपका सबसे अच्छा शर्त अगर आप वर्ग कोष्ठक का उपयोग कर पर अटक कर रहे हैं operator[] है एक चर जो भी [] अतिभारित है (या शायद एक ही प्रकार के एक चर, एक ध्वज सेट के साथ) लौटने के लिए, और है जो शुरू में दूसरे [] के साथ परिवर्तनीय सौदा वापस कर दिया।

लेकिन यहां सबसे अच्छा समाधान (जैसा कि पहले से ही another answer में उल्लिखित है) () जैसे विभिन्न ऑपरेटर का उपयोग करना है।

+0

अस्पष्टता को आसानी से हल किया जा सकता है, उदा। एक लालची पार्सिंग का उपयोग करके। साथ ही, आपके पहले कोड में एक त्रुटि होती है क्योंकि 'नया' एक * सूचक * देता है। –

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