2011-10-21 5 views
6

है मैं एक समस्या है कि जब मैं कुछ इस तरह का उपयोग करें:कैसे वापस जाने के लिए "नहीं मिला" जब वापसी मान स्थिरांक संदर्भ

const MyList& my_list = getListForThisRegion(/*region ID, ...*/); 

मुझे पता है कि जब कोई मूल्य नहीं पाया जाता है वापस जाने के लिए नहीं है।

मेरी समस्या यह है कि मैं संकेतक (getListForThisRegion से मूल्य लौटने पर) कॉलर को "मूल्य नहीं मिला" संकेत देना चाहता हूं। अगर मैं एक सूचक लौटा रहा था, तो मैं nullptr वापस कर सकता था, लेकिन मुझे नहीं पता कि संदर्भों के साथ इसे कैसे किया जाए। मैं सोच सकता हूं कि कुछ स्थिर सदस्य not_found टाइप MyList है, और इसके संदर्भ में लौट रहा है, लेकिन यह बदसूरत लगता है।

और हाँ, मैं मूल्य वापस नहीं कर सकता क्योंकि सूचियां "वसा" होती हैं और अक्सर उपयोग की जाती हैं।

संपादित करें: महान उत्तरों का टन, लेकिन अपवाद स्वीकार्य समाधान नहीं है क्योंकि इसे उठाए जाने की संख्या उच्च है (प्रतिशत nbNotFound/nbCalls उच्च है)।
EDIT2: बढ़ावा के बारे में :: वैकल्पिक - यह मास्टर के लिए कितना जटिल है? मेरा मतलब है कि इसे कुछ गैर स्पष्ट ज्ञान की आवश्यकता है (गैर स्पष्ट = कुछ जो सिंटैक्स को नहीं जानता है)?

+3

अपवाद फेंकना एक अच्छा विकल्प हो सकता है। – BigMike

+1

आप 'boost :: वैकल्पिक' – Akanksh

+0

पर भी देखना चाहते हैं एक संदर्भ को किसी ऑब्जेक्ट को संदर्भित करना है, इसलिए आप या तो अपवाद फेंकते हैं या संदर्भ का उपयोग नहीं करते हैं। 'बूस्ट :: वैकल्पिक' एक अच्छा विकल्प है, लेकिन यह अधिक हो सकता है; बस एक सूचक का उपयोग करें। – GManNickG

उत्तर

7

इस संभाल करने के लिए दो मुहावरेदार तरीके हैं:

  • एक प्रकार है कि (है कि रिक्त हो सकता है जैसे एक सूचक, end के लिए एक इटरेटर) कुछ भी नहीं करने का उल्लेख करने की क्षमता है वापस जाने के लिए अपने इंटरफेस बदलें।

या

  • एक अपवाद फेंक यदि आइटम नहीं मिला है।

एक डमी वस्तु रिटर्निंग एक सा hacky है, और आप एक सूचक लौटने से अधिक कुछ भी हासिल नहीं करते हैं तो आप अभी भी एक विशेष मूल्य (शून्य या डमी वस्तु) के खिलाफ परिणाम की जाँच करने के लिए है के रूप में।

+3

'बूस्ट :: वैकल्पिक' यहां एक अच्छा प्रकार है। –

+0

@ edA-qamort-ora-y: जो संदर्भ के बजाय मूल्य से वापस लौटने के लिए अर्थशास्त्र को बदल देगा (जब तक आप एक वैकल्पिक संदर्भ नहीं लौटाते, लेकिन मुझे नहीं लगता कि यह सूचक में क्या जोड़ता है)। –

+0

@ माइक: कैसे 'बूस्ट :: वैकल्पिक > '? – fredoverflow

1

मैं अपवाद वर्ग (पदानुक्रम, यदि आवश्यक हो) लिखूंगा और ऐसे मामले के लिए अपवाद फेंक दूंगा।

1

मुझे केवल दो संभावनाएं दिखाई देती हैं: या तो आपके पास माईलिस्ट वर्ग में एक विशेष सदस्य है जो घोषित करता है कि एक उदाहरण "शून्य" (सेट नहीं है) या आप अपवाद फेंक सकते हैं।

+1

शून्य मूल्य को इंगित करने के लिए 'MyList' में कोई सदस्य होने के कारण बहुत घुसपैठ लगता है। ऑब्जेक्ट को दूसरे में लपेटकर इस तरह की सुविधा अक्सर बेहतर होती है। 'बूस्ट। वैकल्पिक 'एक शून्य वस्तु का प्रतिनिधित्व करने के लिए ऐसे रैपर प्रदान करता है। –

1

आप std::map के नेतृत्व का अनुसरण कर सकते हैं, और अपने कंटेनर में एक डिफ़ॉल्ट निर्मित सूची डाल सकते हैं, और उस पर एक संदर्भ वापस कर सकते हैं। जाहिर है, यह इस पर निर्भर करता है कि डिफ़ॉल्ट सूची के बीच एक अर्थपूर्ण अंतर नहीं है, और ऐसी सूची जो बिल्कुल नहीं है।

आप एक क्वेरी फ़ंक्शन भी जोड़ सकते हैं जो किसी विशेष क्षेत्र की खोज करता है, और यदि कोई सूची है, और अन्यथा गलत है तो सत्य लौटाता है। फिर, आप ज्ञान में अपने एक्सेसर में एक अपवाद फेंक सकते हैं कि यह एक आम घटना नहीं होगी।

3

"रिटर्नवैल्यू" के संदर्भ में फ़ंक्शन को फिर से लिखने के बारे में, जहां आप सूची को वापस लौटते हैं? फिर फ़ंक्शन बूलियन मान लौटा सकता है जो पाया/पाया नहीं जाता है।

bool getListForThisRegion(/*region ID, ...*/, MyList& ret_list); 
संबंधित मुद्दे