2012-05-11 18 views
11

से किसी ऑब्जेक्ट का रिटर्न संदर्भ मैं एक वेक्टर से किसी ऑब्जेक्ट का संदर्भ वापस करना चाहता हूं, और ऑब्जेक्ट एक इटरेटर ऑब्जेक्ट में है। मैं उसे कैसे कर सकता हूँ?किसी ऑब्जेरेटर

मैं निम्नलिखित की कोशिश की:

Customer& CustomerDB::getCustomerById (const string& id) { 
    vector<Customer>::iterator i; 
    for (i = customerList.begin(); i != customerList.end() && !(i->getId() == id); ++i); 

    if (i != customerList.end()) 
     return *i; // is this correct? 
    else 
     return 0; // getting error here, cant return 0 as reference they say 
} 

कोड में, customerList ग्राहकों के एक वेक्टर, और समारोह getId ग्राहक की आईडी रिटर्न है।

*i सही है? और मैं संदर्भ के रूप में 0 या शून्य कैसे कर सकता हूं?

उत्तर

18

return *i; सही है, हालांकि आप 0, या कोई अन्य मूल्य नहीं लौटा सकते हैं। ग्राहक को वेक्टर में नहीं मिला है तो अपवाद फेंकने पर विचार करें।

वेक्टर में तत्वों के संदर्भों को वापस लौटने पर भी सावधान रहें। वेक्टर में नए तत्व डालने से आपके संदर्भ को अमान्य कर दिया जा सकता है यदि वेक्टर को अपनी स्मृति को फिर से आवंटित करने और सामग्री को स्थानांतरित करने की आवश्यकता होती है।

+0

वैकल्पिक रूप से, वह एक सूचक वापस कर सकता है। 'वापसी i! = CustomerList.end() की लाइनों के साथ कुछ भी? और * मैं: पूर्ण; '। –

+0

कुछ iffy कास्टिंग के साथ एक शून्य संदर्भ बनाने के लिए बस संभव है, लेकिन एक * वास्तव में * बुरा विचार, और संभवतः लगभग हर संभव परिस्थिति में यूबी की संभावना है। – BoBTFish

+0

हाँ, यह फ़ंक्शन के अपेक्षित उपयोग पर बहुत निर्भर करता है। यदि कार्य को कॉल करते समय प्रारंभिक उम्मीद यह है कि ग्राहक मौजूद होना चाहिए, तो अपवाद फेंकना समझ में आता है। यदि इसका उद्देश्य यह पूछने के लिए अधिक है कि "क्या ग्राहक मौजूद है, और यदि ऐसा होता है, तो ग्राहक को वापस करें", फिर एक निरर्थक प्रकार लौटने से अधिक समझदारी मिलती है। –

3

"शून्य" संदर्भ जैसी कोई चीज़ नहीं है: यदि आपकी विधि एक आईडी प्राप्त करती है जो वेक्टर में नहीं है, तो यह किसी भी सार्थक मूल्य को वापस करने में असमर्थ रहेगी। और @reko_t बताते हैं, जब भी वेक्टर अपने आंतरिक को पुन: आवंटित करता है तो एक वैध संदर्भ भी अमान्य हो सकता है।

आपको केवल संदर्भ वापसी प्रकारों का उपयोग करना चाहिए जब आप हमेशा किसी मौजूदा ऑब्जेक्ट का संदर्भ वापस कर सकते हैं जो कुछ समय के लिए मान्य रहेगा। आपके मामले में, न तो गारंटी है।

+0

+1 (जो फ़ंक्शन एक संदर्भ देता है, एक सूचक या इटरेटर) चाहे यह मान्य है। –