मुझे मूल रूप से सी में लिखा गया एक बड़ा एप्लिकेशन विरासत मिला (लेकिन इस बीच में बहुत सी सी ++ भी इसमें जोड़ा गया था)। ऐतिहासिक कारणों से, एप्लिकेशन में बहुत सारे शून्य-पॉइंटर्स होते हैं। चकना शुरू करने से पहले, मुझे समझाएं कि यह क्यों किया गया था।शून्य-पॉइंटर्स से छुटकारा पाने के लिए कैसे करें
एप्लिकेशन में कई अलग-अलग डेटा संरचनाएं हैं, लेकिन वे 'जेनेरिक' कंटेनर में संग्रहीत हैं। आजकल मैं इसके लिए टेम्पलेटेड एसटीएल कंटेनर का उपयोग करूंगा, या मैं सभी डेटा संरचनाओं को एक सामान्य बेस क्लास दूंगा, ताकि कंटेनर बेस क्लास को पॉइंटर्स स्टोर कर सके, लेकिन [अच्छे?] पुराने सी दिनों में, एकमात्र समाधान था संरचना-सूचक को शून्य-सूचक में डालें।
इसके अतिरिक्त, यह है कि इन शून्य-संकेत पर काम करता है कोड का एक बहुत कुछ है, और सी
मैं अब आवेदन दोबारा काम कर रहा हूँ, और कोशिश में बहुरूपता का अनुकरण करने की बहुत ही अजीब सी निर्माण का उपयोग करता है से छुटकारा पाने के शून्य-संकेत दिए गए। सभी डेटा संरचनाओं में एक सामान्य बेस-क्लास जोड़ना कठिन नहीं है (काम के कुछ दिन), लेकिन समस्या यह है कि कोड नीचे दिखाए गए निर्माण से भरा है।
यह कैसे डेटा संग्रहीत किया जाता है का एक उदाहरण है: मैं वास्तव में के साथ सभी शून्य-संकेत बदलना चाहते हैं
Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key);
:
void storeData (int datatype, void *data); // function prototype
...
Customer *myCustomer = ...;
storeData (TYPE_CUSTOMER, myCustomer);
यह कैसे डेटा का एक उदाहरण है फिर से प्राप्त किया गया है कुछ स्मार्ट-पॉइंटर (संदर्भ-गिनती), लेकिन मुझे स्वचालित (या कम से कम) स्वचालित करने के लिए एक चाल नहीं मिलती है जो मुझे शून्य-पॉइंटर्स से और सभी स्थानों से छुटकारा पाने में मदद करती है।
इन रूपांतरणों के साथ किसी भी संभावित तरीके से खोजने, बदलने, या बातचीत करने के बारे में कोई सुझाव?
मुझे सच में विश्वास है कि इसे स्वचालित रूप से करने के लिए कोई चाल नहीं है। एक के बाद एक ... – INS
दुकान और fetch कार्यों 'डेटाटाइप' के साथ क्या करते हैं? क्या वे संरचना की अंधेरी प्रतिलिपि कर रहे हैं या बस उस शून्य सूचक को संग्रहीत कर रहे हैं? –
डेटा प्रकार का उपयोग उसी डेटा प्रकार के सभी डेटा को एकसाथ स्टोर करने के लिए किया जाता है, और डेटा प्रकारों पर कुछ 'सामान्य' तर्क निष्पादित करने के लिए किया जाता है। जैसा कि कहा गया है, यह सादे सी में polymorphism emulates। – Patrick