2011-09-25 20 views
10

मैं कैसे लेखक नोड्स लागू किया गया है को देखने के लिए EASTL's list class के माध्यम से जा रहा था। मेरी उम्मीद एक सरल वर्ग/संरचना थी। इसके बजाय, मुझे एक आधार और एक नोड दिखाई देता है जो इस आधार से विरासत में है (अभी भी सरल है, लेकिन दो वर्ग क्यों?)। उनकी यह टिप्पणी स्पष्टीकरण दें कि:,क्या सी ++ में एक टेम्पलेट प्रकार अपशिष्ट स्थान है?

हम ListNode (नीचे) से अलग से एक ListNodeBase परिभाषित क्योंकि यह हमें, इस तरह के डालने के रूप में गैर टेम्प्लेट ऑपरेशन को दूर (नीचे) की अनुमति देता है, और यह इतना है कि यह बनाता है सूची एंकर नोड में टी के साथ टी नहीं है, जो कचरा स्थान होगा और संभवतः अतिरिक्त टी 0 मौजूदा के कारण उपयोगकर्ता को आश्चर्यचकित कर देगा कि उपयोगकर्ता स्पष्ट रूप से नहीं बना था। इन सभी के लिए नकारात्मकता यह है कि यह एक सूची को डीबग देखने को कठिन बनाता है, यह देखते हुए कि नोड पॉइंटर्स प्रकार ListNodeBase हैं और ListNode नहीं हैं। हालांकि, नीचे ListNodeBaseProxy देखें।

मुझे यहां कुछ चीज़ों को समझ में नहीं आता है। I do इस बारे में समझें कि यह डीबग को थोड़ा कठिन क्यों बना देगा, लेकिन इसका मतलब list anchor node doesn't carry a T with it और would waste space and possibly lead to surprising the user due to extra Ts existing that the user didn't explicitly create से क्या है?

उत्तर

7

सहायक वर्ग के बिना, सूची रूट नोड में टी का एक उदाहरण होगा जिसका उपयोग कभी नहीं किया जाता है। दूसरी वाक्य यह कह रही है कि आप टी को बनाने के लिए खाली सूची की उम्मीद नहीं कर सकते हैं। उदाहरण के लिए, टी बनाने के दुष्प्रभाव हो सकते हैं।

1

ऐसा लगता है कि विचार सूची के अबास्ट्रक्शन को अलग करने के लिए है, जो डेटा लेता है। आप केवल ListNode जब आप वास्तव में डेटा का उपयोग करना चाहते हैं, सब आराम सार ListNodeBase पर किया जा सकता की जरूरत है। इस तरह मैं list anchor node doesn't carry a T with it समझता हूं।

अंतरिक्ष के बारे में कुछ है। टेम्पलेट कक्षाएं प्रति प्रकार बनाई गई हैं, इसलिए T के लिए T के बिना आपके पास कई अलग-अलग प्रकार हैं, तो आप प्रति प्रकार के सभी परिचालनों की टेम्पलेट प्रतियां बनायेंगे, इसके साथ-साथ आप नहीं करते हैं, और LinkNode उन्हें विरासत में लेते हैं, और केवल वास्तविक डेटा के लिए स्मृति की आवश्यकता है। ऐसा लगता है कि सहेजा गया स्थान इस मामले में कोड के वास्तविक आकार को संदर्भित करता है।

+0

आप कोई डेटा नहीं के साथ एक सूची का उपयोग नहीं करते हैं। वहाँ एक भी नोड बुलाया ** लंगर नोड है ** या ** प्रहरी ** कि कुछ विशेष-केस खाली सूचियों के साथ जुड़े कोड को खत्म करने की सूची के प्रत्येक उदाहरण में मौजूद है, यहां तक ​​कि खाली सूची में,। यह एक ऐसा नोड है जिसमें उपयोगकर्ता का डेटा शामिल करने की आवश्यकता नहीं है। –

+0

@ एनएम। वह वर्ग 'सूची' होगा, आप ओपी पोस्ट किए गए लिंक पर कार्यान्वयन पर एक नज़र डाल सकते हैं। चूंकि 'सूची' स्वयं ही सेंटीनेल है, इसलिए बिंदु मंथन है। – littleadv

+0

मैंने देखा है। जहाँ तक मेरा बता सकते हैं, 'list' *,' base_node_type mNode में शामिल * प्रहरी, 'लाइन। –

1

आप वास्तव में खाली सूचियों का समर्थन करना चाहते हैं। सिर नोड ही हमेशा एक टी शामिल है, और हर सूची एक सिर नोड शामिल है, तो यह इस प्रकार है कि हर सूची कम से कम एक टी शामिल हैं, और इसलिए कभी खाली नहीं हो सकता है।

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