2012-06-07 14 views
10

मेरी अनुचित शब्दावली के लिए क्षमा।गैर-सूचक सूचकांक के बराबर क्या है?

ObjectType * MyClass::FindObjectType(const char * objectTypeName) 
{ 
    if (objectTypeMap.find(objectTypeName) == objectTypeMap.end()) 
    { 
     Msg("\n[C++ ERROR] No object type: %s", objectTypeName); 
     return NULL; 
    } 
    else 
     return &objectTypeMap[ objectTypeName ]; 
} 

मैं एक ही बात करना चाहता हूँ लेकिन इस बार के बजाय एक वस्तु लौटने सिर्फ एक सूचक की:

मैं अगर एक प्रविष्टि मौजूद नहीं है कोड का एक टुकड़ा है कि एक शून्य सूचक रिटर्न दिया है। सूचक मैं जाँच कर सकते हैं के साथ

ObjectType MyClass::FindObjectType(const char * objectTypeName) 
{ 
    if (objectTypeMap.find(objectTypeName) == objectTypeMap.end()) 
    { 
     Msg("\n[C++ ERROR] No object type: %s", objectTypeName); 
    } 
    else 
     return objectTypeMap[ objectTypeName ]; 
} 

अगर प्रविष्टि इसलिए की तरह नहीं मिला था: निम्नलिखित कोड मुझे किसी भी संकलक त्रुटियों न जताए (जो मुझे तो हैरानी)

if (FindObjectType(objectType) == NULL) 
    //Do something 

मैं कैसे करूँ वापस आने वाली वस्तु के साथ समकक्ष जांच करें?

+3

'बढ़ावा :: वैकल्पिक ' या एक अपवाद। – GManNickG

उत्तर

12

वस्तुओं के लिए कोई भाषा-स्तर समकक्ष नहीं है।

एक विकल्प एक "प्रहरी" उद्देश्य यह है कि किसी भी "असली" वस्तु को असमान तुलना करने के लिए गारंटी है बनाते हैं, और वापस जाने के लिए है:

class ObjectType { 
public: 
    static const ObjectType null; 

    bool operator==(const ObjectType &rhs) const { /* need an appropriate comparison test */ } 

    ... 
}; 

ObjectType ObjectType::null(/* something unique */); 


... 

ObjectType foo(const char *objectTypeName) { 
    if (cond) { 
     return objectTypeMap[objectTypeName]; 
    } else { 
     return ObjectType::null; 
    } 
} 


... 

if (foo(objectType) == ObjectType::null) { 
    std::cout << "Returned the null object\n"; 
} 
+0

आपके उत्तर के लिए धन्यवाद। क्या आप दिखा सकते हैं कि यह कैसे किया जाता है? –

+0

@PhloxMidas: क्या मेरे उत्तर में छद्म कोड पर्याप्त है? –

4

निम्नलिखित कोड एक त्रुटि दे रही है नहीं है, क्योंकि मानक है बहुत रूढ़िवादी

कुछ कोड संरचनाएं बेहद जटिल हैं और संकलक यह नहीं जान सकता कि फ़ंक्शन का अंत तक पहुंच सकता है या नहीं। इसलिए मानक कहता है कि संकलक को यह साबित करने की ज़रूरत नहीं है कि फ़ंक्शन सही ढंग से मान देता है ...

हालांकि मानक कहता है कि एक फ़ंक्शन सामान्य रूप से समाप्त नहीं होना चाहिए (कोई अपवाद नहीं) बिना किसी मूल्य को वापस किए, अपरिभाषित व्यवहार आवेदित है (यानी, कुछ भी हो सकता है, संभवतः एक दुर्घटना हो सकती है)। इस तरह की स्थिति के लिए अधिकांश कंपिलरों में चेतावनी है, जीसीसी और क्लैंग के लिए आप -Wreturn का उपयोग कर सकते हैं।


अब, तुच्छता या प्रहरी को महत्व देता के सिद्धांत नया नहीं है, और एक अशक्त सूचक सिर्फ एक अवतार (कई के बीच) है।

यह मतलब नहीं होता है अपने वस्तु व्यर्थ होने के लिए (यह शायद ही कभी होता है लेकिन एक समीचीन हो सकता है) तो आप 2 विकल्प है: त्रुटि संकेत करने के लिए

  • वापसी एक

    • throw एक अपवाद आवरण वर्ग (जैसे boost::optional<ObjectType> के रूप में) जो, अशक्त

    इस हालत में हो सकता है के बाद से यह आशा की जाती है कि Find कुछ भी नहीं मिल सकता है, मैं सामान्य रूप में उत्तरार्द्ध सलाह देंगे।

    प्रयोग सरल है:

    boost::optional<ObjectType> MyClass::FindObjectType(char const* objectTypeName) 
    { 
        if (objectTypeMap.find(objectTypeName) == objectTypeMap.end()) { 
         // do not print anything, it is up to the caller to decide what to do 
         return boost::none; 
        } 
    
        return objectTypeMap[ objectTypeName ]; 
    } 
    

    और फिर फोन करने वाले लिखते हैं:

    int main(int argc, char* argv[]) { 
        if (boost::optional<ObjectType> o = MyClass::FindObject(argv[1])) { 
         o->foo(); 
    
         return 0; 
        } 
    
        Msg("\n[C++ ERROR] No object type: %s", argv[1]); 
        return 1; 
    } 
    
  • +0

    'बूस्ट :: कोई नहीं' परिवर्तनीय 'झूठी' है? – Nawaz

    +0

    @ नवाज: मुझे ऐसा नहीं लगता ... और मुझे समझ में नहीं आता कि आप वास्तव में क्यों पूछते हैं। –

    +0

    @ नवाज़: 'बूस्ट :: वैकल्पिक ' का उपयोग बूलियन अभिव्यक्तियों में किया जा सकता है, [सुरक्षित बूल मुहावरे] (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool) के एक संस्करण पर निर्भर करता है। । तो आप मूल्य की उपस्थिति का परीक्षण करने के लिए 'if (myOptional) 'लिख सकते हैं (या' if (! MyOptional)' इसकी अनुपस्थिति का परीक्षण करने के लिए)। –

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