2010-06-11 16 views
6

मुझे मूल रूप से सी में लिखा गया एक बड़ा एप्लिकेशन विरासत मिला (लेकिन इस बीच में बहुत सी सी ++ भी इसमें जोड़ा गया था)। ऐतिहासिक कारणों से, एप्लिकेशन में बहुत सारे शून्य-पॉइंटर्स होते हैं। चकना शुरू करने से पहले, मुझे समझाएं कि यह क्यों किया गया था।शून्य-पॉइंटर्स से छुटकारा पाने के लिए कैसे करें

एप्लिकेशन में कई अलग-अलग डेटा संरचनाएं हैं, लेकिन वे 'जेनेरिक' कंटेनर में संग्रहीत हैं। आजकल मैं इसके लिए टेम्पलेटेड एसटीएल कंटेनर का उपयोग करूंगा, या मैं सभी डेटा संरचनाओं को एक सामान्य बेस क्लास दूंगा, ताकि कंटेनर बेस क्लास को पॉइंटर्स स्टोर कर सके, लेकिन [अच्छे?] पुराने सी दिनों में, एकमात्र समाधान था संरचना-सूचक को शून्य-सूचक में डालें।

इसके अतिरिक्त, यह है कि इन शून्य-संकेत पर काम करता है कोड का एक बहुत कुछ है, और सी

मैं अब आवेदन दोबारा काम कर रहा हूँ, और कोशिश में बहुरूपता का अनुकरण करने की बहुत ही अजीब सी निर्माण का उपयोग करता है से छुटकारा पाने के शून्य-संकेत दिए गए। सभी डेटा संरचनाओं में एक सामान्य बेस-क्लास जोड़ना कठिन नहीं है (काम के कुछ दिन), लेकिन समस्या यह है कि कोड नीचे दिखाए गए निर्माण से भरा है।

यह कैसे डेटा संग्रहीत किया जाता है का एक उदाहरण है: मैं वास्तव में के साथ सभी शून्य-संकेत बदलना चाहते हैं

Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key); 

:

void storeData (int datatype, void *data); // function prototype 
... 
Customer *myCustomer = ...; 
storeData (TYPE_CUSTOMER, myCustomer); 

यह कैसे डेटा का एक उदाहरण है फिर से प्राप्त किया गया है कुछ स्मार्ट-पॉइंटर (संदर्भ-गिनती), लेकिन मुझे स्वचालित (या कम से कम) स्वचालित करने के लिए एक चाल नहीं मिलती है जो मुझे शून्य-पॉइंटर्स से और सभी स्थानों से छुटकारा पाने में मदद करती है।

इन रूपांतरणों के साथ किसी भी संभावित तरीके से खोजने, बदलने, या बातचीत करने के बारे में कोई सुझाव?

+1

मुझे सच में विश्वास है कि इसे स्वचालित रूप से करने के लिए कोई चाल नहीं है। एक के बाद एक ... – INS

+0

दुकान और fetch कार्यों 'डेटाटाइप' के साथ क्या करते हैं? क्या वे संरचना की अंधेरी प्रतिलिपि कर रहे हैं या बस उस शून्य सूचक को संग्रहीत कर रहे हैं? –

+0

डेटा प्रकार का उपयोग उसी डेटा प्रकार के सभी डेटा को एकसाथ स्टोर करने के लिए किया जाता है, और डेटा प्रकारों पर कुछ 'सामान्य' तर्क निष्पादित करने के लिए किया जाता है। जैसा कि कहा गया है, यह सादे सी में polymorphism emulates। – Patrick

उत्तर

0

जाहिर है, शून्य-पॉइंटर्स के सभी उपयोगों को बदलने या खोजने के लिए कोई स्वचालित तरीका/चाल नहीं है।मुझे पीसी-लिंट के साथ संयोजन में सभी शून्य-पॉइंटर्स खोजने के लिए मैन्युअल श्रम का उपयोग करना होगा जो गलत रूपांतरण होने पर त्रुटियां देगा।

केस बंद हुआ।

0

आपको शायद साझा पॉइंटर्स का उपयोग करने के लिए जानवरों से छुटकारा पाने की आवश्यकता नहीं है।

storeData(TYPE_CUSTOMER, myCustomer1->get()); 

shared_ptr<Customer> myCustomer2(reinterpret_cast<Customer*>fetchData(TYPE_CUSTOMER, "???"); 
बेशक

, इस मानता है कि आप की दुकान/लाने के लिए कॉल में एक ही सूचक साझा करने के लिए उम्मीद नहीं है। दूसरे शब्दों में, myCustomer1 और myCustomer2 एक ही पॉइंटर साझा नहीं करते हैं।

7

मैं वास्तव में कुछ स्मार्ट सूचक (संदर्भ बार गणना) के साथ सभी शून्य-संकेत बदलना चाहते हैं, लेकिन मैं एक चाल स्वचालित करने के लिए नहीं मिल रहा है (या कम से कम) मुझे पाने के लिए मदद शून्य-पॉइंटर्स से सभी कोस्ट से से छुटकारा पाएं।

इस तरह के स्वचालित रिफैक्टरिंग में कई जोखिम होते हैं।

अन्यथा, कभी-कभी मैं इस तरह के शून्य * टेम्पलेट फ़ंक्शंस को फ़ंक्शन से बाहर कर चलाकर चाल खेलना पसंद करता हूं। यही कारण है कि:

void storeData (int datatype, void *data); 

हो जाता है: पहले बस मूल (नाम बदला) समारोह लपेटकर और प्रकार में कनवर्ट करके टेम्पलेट लागू

template <class T> 
void storeData (int datatype, T *data); 

पर। इससे आपको संभावित समस्याओं को देखने की अनुमति मिल सकती है - पहले ही कोड को संकलित करके।

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

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