2009-05-20 106 views
7

मैं एक सदस्य स्तरीय एक सूची वर्ग के लिए के रूप में एक इटरेटर वर्ग बनाने के लिए कोशिश कर रहा हूँ, और अविवेक ऑपरेटर (*) सूची यह की ओर इशारा करते है का उपयोग करने के ओवरलोड कोशिश कर रहा हूँ:इंडिकेटर ऑपरेटर को अधिभार कैसे करें? (C++)

template<class T> 
T list<T>::iterator::operator*(iterator& iter) 
{ 
    return ((iter.lstptr)->current)->data; 
} 

जहां lstptr एक सूची के लिए सूचक है, current एक नोड क्लास के लिए एक सूचक है, और नोड क्लास में प्रकार T का डेटा सदस्य होता है।

इटरेटर इस तरह घोषित किया जाता है:

list<int> lst1; 
lst1.add(6); 
list<int>::iterator IT; 
IT = lst1; 
//everything above this point compiles fine 
int a = *IT; //error here (line fourteen) 

त्रुटि:

template<class T> 
class list 
{ 
public: 
class iterator; 
}; 

template<class T> 
class list<T>::iterator 
{ 
//stuff 
}; 

मैं ठीक अतिभारित ऑपरेटर के समारोह परिभाषा * संकलित करने के लिए है, लेकिन में सक्षम हूँ जब मैं की तरह कुछ करने की कोशिश मुझे लगता है कि < 1> कि मैं एक अवैध संकेत का उपयोग कर रहा हूं, और < 2> कि यह सूची :: iterator से int में परिवर्तित नहीं हो सकता है। दोनों त्रुटियां चौदह पंक्ति पर होती हैं।

क्या कोई जानता है कि मैं क्या गलत कर रहा हूं और मैं इंडिकेटर ऑपरेटर को सही तरीके से कैसे अधिभारित कर सकता हूं?

एनबी: यदि आपको और कोड देखने की आवश्यकता है, तो मुझे कौन सा हिस्सा बताएं, क्योंकि मैं पूरे कोड को यहां नहीं रखना चाहता क्योंकि यह 205 लाइनों में है, और उन पंक्तियों में से 204 (मुझे लगता है) कोई त्रुटि है

+0

क्या आपको "सूची :: इटरेटर आईटी टाइप करना था;" - यह "सूची :: इटरेटर आईटी होना चाहिए;", है ना? – leander

+0

@leander: हाँ, इसकी सूची वास्तविक कोड में, मैंने बस इसे अपने उदाहरण में टाइप करना गड़बड़ कर दिया। –

उत्तर

12

आपने गुणा ऑपरेटर को अधिभारित किया। इसे एक संकेतक ऑपरेटर बनाने के लिए पैरामीटर निकालें।

template<class T> 
T list<T>::iterator::operator*() 
{ 
    return ((this->lstptr)->current)->data; 
} 

आप भी इसे एक संदर्भ वापसी अगर आप संकलित करने के लिए *IT = 3; की तरह कोड चाहते हैं होना चाहिए।

template<class T> 
T& list<T>::iterator::operator*() 
{ 
    return ((this->lstptr)->current)->data; 
} 
+1

यह गुणा ऑपरेटर नहीं है! लेकिन आप एक संदर्भ लौटने के बारे में सही हैं। – Zifre

+4

उसे ऑपरेटर * को एक नि: शुल्क फ़ंक्शन के रूप में लिखना चाहिए क्योंकि यह संकेतक ऑपरेटर है। चूंकि यह ओपी द्वारा लिखा गया था, यह गुणा ऑपरेटर है।मैंने वास्तव में इसे अनदेखा कर दिया, पूरी तरह से इस तथ्य को अनदेखा कर दिया कि इसे स्पष्ट रूप से सदस्य के रूप में घोषित किया गया है :) –

+0

तो वापस लौटें "((यह-> lstptr) -> वर्तमान) -> डेटा"? –

5

आपके यहां दो समस्याएं हैं; पहला यह है कि आपने गलती से गुणात्मक ऑपरेटर को अधिभारित किया है, न कि डेफरेंसिंग ऑपरेटर; दूसरा यह है कि आपने संदर्भ प्रकार वापस नहीं किया है।

पहला मुद्दा पैरामीटर की संख्या के परिणामस्वरूप आता है। कक्षा के प्रत्येक गैर स्थैतिक सदस्य फ़ंक्शन में अतिरिक्त "छुपा" पैरामीटर होता है: thisthis, ज़ाहिर है, ऑब्जेक्ट के पॉइंटर को फ़ंक्शन पर लगाया जा रहा है। नतीजतन, आपने वास्तव में ऑपरेटर का एक संस्करण दो पैरामीटर लेने का घोषित किया है। दूसरे पुनरावर्तक पैरामीटर को हटाकर और this पर परिचालन करके, आप असी * को ओवरलोड कर रहे हैं और बाइनरी नहीं।

दूसरा मुद्दा वापसी प्रकार का मामूली है; आप मूल प्रतिलिपि पर एक प्रतिलिपि वापस कर रहे हैं, न कि मूल वस्तु स्वयं। एक संदर्भ वापस करने के लिए वापसी प्रकार को T& के रूप में घोषित करें।

+0

+1। रिटर्न प्रकार के संबंध में, यह * एक प्रतिलिपि वापस करने के लिए बेहतर हो सकता है क्योंकि ओपी कर रहा है यदि अंतर्निहित प्रकार एक छोटा मूल्य प्रकार है और यह असाइन करने योग्य नहीं है - लेकिन यह एक असामान्य मामला होगा। कॉप्रो के सुझाव के रूप में एक रेफरी पसंद करते हैं। –

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