2010-06-15 22 views
8

के बजाय शून्य मैं एक struct Foo है। स्यूडोकोड में:सी ++: वापसी struct

def FindFoo: 
    foo = results of search 
    foundFoo = true if a valid foo has been found 

    return foo if foundFoo else someErrorCode 

मैं कैसे सी ++ में ऐसा कर सकते हैं?

कई त्रुटियों को दूर करने के लिए संपादित किया गया।

+0

आपका रिटर्न प्रकार असंगत है। यदि खोज सफल हो जाती है, तो यह 'Foo & 'है; अगर यह विफल रहता है, तो यह 'त्रुटि कोड' है। इस समस्या का समाधान एक 'फू *' वापस करना होगा, जो पाया गया तत्व को इंगित करता है, या यदि कोई तत्व नहीं मिला तो न्यूल होता है। – pyon

उत्तर

12

सी ++ वस्तुओं शून्य या खाली कभी नहीं हो सकता है। पॉइंटर्स एक शून्य पॉइंटर मान धारण कर सकते हैं जो इंगित करता है कि वे कुछ भी नहीं बताते हैं।

ठेठ समाधान एक अपवाद फेंकने के लिए होगा। अन्यथा, एक सूचक का उपयोग करें; बस सुनिश्चित करें कि आप अस्थायी के पते को वापस नहीं कर रहे हैं।

मैं अपने आप को पढ़ाने के सी अन्य भाषाओं से ज्ञान के साथ ++ करने की सलाह देते नहीं होगा, आप अपने आप को चोट लगी हूँ। good beginner-level book पकड़ो, यह सीखने का सबसे अच्छा तरीका है।

+7

+1 "मैं अन्य भाषाओं से ज्ञान के साथ स्वयं को सी ++ सिखाने की कोशिश नहीं करता हूं" –

+1

मुझे लगता है कि ठेठ समाधान एसटीएल की नकल करना होगा जो रिटर्न ऑब्जेक्ट की तरह एक इटरेटर जो अमान्य वस्तुओं को इंगित करता है (कंटेनर के अंत में एक)। –

+0

@ मार्टिन: मैं बस इतना कहूंगा कि यह एक अधिक सामान्यीकृत सूचक है और आपको आधे रास्ते से मिलते हैं। : पी – GManNickG

1

यह सी # में काम नहीं करता है। आपको फू को पॉइंटर वापस करना चाहिए।

+3

@ ड्यूरा, सवाल यह है कि "मैं इसे सी ++ में कैसे पूरा कर सकता हूं?" –

+0

इसमें सी # टैग भी है! – nevets1219

0

आप इसे सी # में नहीं कर सकते हैं - आपको संकलक को खुश करने के लिए new Foo(), null वापस नहीं करना होगा।

सी ++ मामले डिट्टो - यदि आप एक struct का दृष्टांत को आप मूल्य से वापस जाने के लिए जा रहे हैं की जरूरत है। यदि नहीं, तो आप पॉइंटर द्वारा वापस लौटना चाहते हैं (इस मामले में आप new आईएनजी या किसी अन्य तरीके से आवंटित एक पॉइंटर लौटाना चाहते हैं, जो समीकरण में गन्दा स्वामित्व हस्तांतरण अर्थशास्त्र लाता है)।

संपादित करें: आपके अपडेट के आधार पर। ऐसा लगता है कि आप या तो एक मान या 'शून्य' मेटा-वैल्यू वापस करना चाहते हैं जो 'नहीं मिला' इंगित करता है। आप कई तरीकों से में यह कर सकते हैं:

  1. throw यह विफल रहता है, अन्यथा बिना शर्त एक मूल्य
  2. वापसी एक सूचक लौट - लेकिन इस हवा में इसे ing अगर यह कुछ नहीं है delet के लिए जिम्मेदारी छोड़ देता है कि स्मृति लंबे समय में रहने के लिए जा रहा है
  3. एक [टेम्प्लेट] आवरण उद्देश्य यह है कि एक ही तरह से नेट के Nullable<T> होगा (मैं किसी को सही एक अद्यतन के साथ झंकार दूँगा कि में शर्त संभालती में लपेट: @Mike सेमुर कहते हैं कि यह boost::optional<foo>)
  4. नल ऑब्जेक्ट पी का उपयोग करें

    public Foo* findFoo() 
    { 
        return fooFound ? new fooResult() : NULL; 
    } 
    

    एक और संभावना है: एक उचित मूल्य जो सही बात है जब क्लाइंट की तरफ एक वैध resut यह एक foo के लिए सूचक वापस जाने के लिए है करने के

1

एक ही रास्ता के रूप में व्यवहार करता है वापस जाने के लिए attern एक NullFoo को किसी प्रकार के struct को Foo को खाली कार्यान्वयन के साथ विस्तारित करने के लिए। बाद के विचार के बारे में अधिक जानकारी के लिए, आप Null Object Pattern के बारे में पढ़ सकते हैं।

संपादित करें: संशोधित सवाल कुछ अलग है, और जैसा कि अन्य लोगों का उल्लेख किया है, तो आप अपवाद फेंकने के बजाय ऊपर से कोई एक कार्य बंद सबसे अच्छा हो सकता है।

+0

fooFound केवल जांच करने की स्थिति है, fooResult जो वापस आ गया है। –

+1

एक और संभावना 'बूस्ट :: वैकल्पिक 'है। तो आपको इसे हटाने के लिए याद रखना नहीं है। –

+0

@ माइक सेमुर: धन्यवाद - मेरे जवाब को पूरा करने के लिए नब्बिंग # 3 –

1

मानक लाइब्रेरी के बाहर पॉइंटर्स या लाइब्रेरी समाधान का उपयोग किए बिना सी ++ में संभव नहीं है।(बूस्ट मानक पुस्तकालय का हिस्सा नहीं है, यह एक तृतीय पक्ष समाधान है।)

सी # में, आप Nullable<Foo> का उपयोग कर सकते हैं।

बिली की टिप्पणी के विपरीत, structs, मूल्य प्रकार के होते हैं प्रकार का संदर्भ नहीं है, और Nullable के लिए किसी भी मान प्रकार, न सिर्फ बनाया-इन लागू किया जा सकता। निम्नलिखित संकलित बस ठीक है:

struct Test { 
    int Blah; 
} 
void Main() { 
    System.Nullable<Test> proof; 
} 
+0

नहीं, आप नहीं कर सकते। सबसे पहले, Nullable केवल आंतरिक प्रकारों पर मान्य है, उपयोगकर्ता परिभाषित प्रकारों जैसे 'Foo' पर नहीं। दूसरा, भले ही यह मान्य हो, फिर भी यह आपकी मदद नहीं करेगा क्योंकि ऑब्जेक्ट संदर्भ पहले से ही शून्य हो सकते हैं। और अंत में, ओपी ने एक त्रुटि कोड वापस करने के लिए कहा, न कि पूर्ण। –

+0

@ बिली: -1s पर आसान। संरचना का अर्थ मान प्रकार है, संदर्भ नहीं है और आप एक शून्य मूल्य प्रकार कर सकते हैं - यह पूरा बिंदु –

+0

+1 वास्तविक रूप से .NET बिट को सही करता है। सी ++ बिट के लिए, हालांकि पॉइंटर्स को छोड़ने के आसपास तरीकों को छोड़ देता है [जैसे नल ऑब्जेक्ट पैटर्न, फेंकना, बूस्ट में लपेटना :: वैकल्पिक]। उत्तर के रूप में +1 करना विषय या गलत से नहीं। यहां तक ​​कि अधिक अप्रचलित और अधूरे उत्तरों को ऊपर उठाया गया है। –

4

अपवाद फेंको। यही वह है जो वे हैं।

3

आप boost::optional पर देख सकते हैं और देख सकते हैं कि यह आपकी आवश्यकताओं के अनुरूप है या नहीं। हालांकि:

वापसी foo अगर foundFoo बाकी someErrorCode

यह मैं लगता है कि आप एक अपवाद फेंकने से बेहतर हो सकता है अगर आप foo नहीं मिल रहा है बनाता है।

1

कोई फू वास्तव में असाधारण स्थिति नहीं ढूंढ रहा है? फिर एक अपवाद फेंक दें। Foo नहीं ढूंढने की उम्मीद है? फ़ंक्शन एक त्रुटि कोड लौटाता है और संदर्भ पैरामीटर के माध्यम से foo को पास करता है, जहां फ़ू केवल तभी मान्य होता है जब फ़ंक्शन कोई त्रुटि न करे।

+0

यह मेरा दृष्टिकोण होगा। चीजों को सरल रखना, और निर्भरता न्यूनतम। –

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