2009-10-05 26 views
5

[संपादित करें 1 - जोड़ा तीसरे सूचक वाक्य रचना (धन्यवाद एलेक्स)]सी ++ दाल - वापसी संदर्भ या संदर्भ में पारित पॉप्युलेट

कौनसी विधि और क्यों के बाहर एक दाल के लिए पसंद करेंगे:

Car& DAL::loadCar(int id) {} 
bool DAL::loadCar(int id, Car& car) {} 
Car* DAL::loadCar(int id) {} 

यदि कार को खोजने में असमर्थ पहली विधि शून्य हो जाती है, तो दूसरी विधि झूठी होती है।

दूसरी विधि ढेर पर एक कार वस्तु उत्पन्न करेगी और डेटाबेस से पूछे गए डेटा के साथ पॉप्युलेट करेगी। मुमकिन है (मेरी सी ++ बहुत जंग लगी है) कि की तर्ज पर कोड का मतलब होगा:

Car& DAL::loadCar(int id) 
{ 
    Car *carPtr = new Car(); 
    Car &car= *carPtr; 
    car.setModel(/* value from database */); 
    car.setEngineSize(/* value from database */); 
    // etc 
    return car; 
} 

धन्यवाद

उत्तर

5

दूसरा निश्चित रूप से बेहतर है। आप किसी ऑब्जेक्ट का संदर्भ वापस कर रहे हैं जिसे नया किया गया है। सॉफ़्टवेयर का उपयोग करने वाले अंतिम उपयोगकर्ता के लिए यह स्पष्ट नहीं है कि लौटाए गए ऑब्जेक्ट को हटाने की आवश्यकता होगी। प्लस यदि उपयोगकर्ता इस

Car myCar = dal.loadCar(id); 

जैसे कुछ करता है तो सूचक खो जाएगा।

इसलिए आपकी दूसरी विधि कॉलर पर स्मृति का नियंत्रण रखती है और किसी भी अजीब गलतियों को होने से रोकती है।

संपादित करें: संदर्भ द्वारा वापसी समझदार है, केवल तभी जब माता-पिता, यानी डीएएल, कक्षा संदर्भ के जीवनकाल पर नियंत्रण रखती है। यानी यदि डीएएल कक्षा में कार ऑब्जेक्ट्स का वेक्टर था तो एक संदर्भ लौटने के लिए एक पूरी तरह से समझदार बात होगी।

संपादित 2: मैं अभी भी दूसरा सेट अप पसंद करूंगा। तीसरा पहले की तुलना में कहीं बेहतर है, लेकिन आप कॉलर को यह मानते हैं कि ऑब्जेक्ट शुरू किया गया है।

तुम भी प्रदान कर सकता है

Car DAL::loadCar(int id); 

और आशा ढेर कॉपी भेज सकते हैं।

यह भी मत भूलना कि आप एक प्रकार की नल कार वस्तु बना सकते हैं ताकि आप "वैध" आशोधन वाली वस्तु वापस कर सकें लेकिन आपको सभी क्षेत्रों में कोई उपयोगी जानकारी नहीं मिलती है (और इस प्रकार स्पष्ट रूप से डेटा को कचरा शुरू किया जाता है)। यह शून्य ऑब्जेक्ट पैटर्न है।

+0

धन्यवाद। यहां तक ​​कि अगर कॉलर ने लिखा "कार और MyCar = dal.loadCar (आईडी)" सूचक खो जाएगा नहीं? क्या डीएएल द्वारा बनाई गई मेमोरी को हटाने के लिए गैर डीएएल कोड के लिए वैसे भी है? – ng5000

+0

नहीं, अगर कॉलर ने लिखा है कि आपने अभी लिखा है कि स्मृति "मुक्त" हो सकती है। ऐसा करने के लिए आपको "&myCar; हटाएं" कॉल करना होगा .. जो बहुत अजीब लग रहा है। – Goz

+0

स्टैक कॉपी भी नहीं हो सकती है: कंपाइलर और अनुकूलन के आधार पर, (एन) आरवीओ किक कर सकता है और ऑपरेशन को # 1 के बराबर बना सकता है। किसी भी मामले में, जब कार नहीं मिलती है तो अपवाद फेंकना आवश्यक होगा। –

4

चूंकि आप किसी भी तरह से ढेर पर ऑब्जेक्ट आवंटित कर रहे हैं, इसलिए कार * लोडकायर() पर विचार न करें, अगर समस्या उत्पन्न होती है तो न्यूल वापस आती है। इस तरह आपके पास संदर्भ प्रकारों के साथ कोई प्रतिबंध नहीं है (प्रत्येक संदर्भ को प्रारंभ किया जाना चाहिए) और त्रुटि केस को सिग्नल करने का भी अर्थ है।

+0

एक तीसरा विकल्प जोड़ने के लिए उचित, अद्यतन प्रश्न लगता है। – ng5000

+0

कार और डीएएल :: लोडकायर (int आईडी) वापस नहीं लौटा सकता है; कोई शून्य संदर्भ नहीं है, केवल शून्य पॉइंटर्स। – Massa

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