2012-02-09 14 views
10

मेरे पास कक्षा है जो एक विधि घोषित करती है लेकिन इसे लागू नहीं करती है। विधि वर्चुअल फ़ंक्शन नहीं है। इसी सीपीपी फ़ाइल में मुझे एक ही विधि की परिभाषा नहीं मिली। कक्षा में घोषित सभी अन्य विधियों को परिभाषित किया गया था।कक्षा में घोषित विधि लेकिन परिभाषित नहीं

मैंने कोड संकलित किया और यह ठीक हो गया। मैं इस धारणा का था कि सीपीपी को घोषित विधि की परिभाषा को अनिवार्य करना होगा।

अगर कोई इस पर विस्तार कर सकता है तो सराहना करें। मैं वीएस -2010 से सीएल कंपाइलर का उपयोग कर रहा हूं।

उत्तर

10

आपका कोड संकलित करेगा लेकिन यह लिंकिंग त्रुटियां देगा।

  • संकलन
  • लिंक करना

संकलन दौरान संकलक केवल भाषा अर्थ विज्ञान की पुष्टि करने से वस्तु कोड में स्रोत कोड अनुवाद:

अपनी परियोजना के एक निष्पादन का निर्माण दो चरणों शामिल ।
लिंकिंग वास्तव में प्रतीकों की परिभाषाओं को देखता है और एकाधिक ऑब्जेक्ट फ़ाइलों (संकलन के दौरान बनाए गए) से निष्पादन योग्य बनाता है।

संकलक प्रत्येक अनुवाद इकाई (.cpp + हेडर फाइल) में स्रोत कोड को अलग से संकलित करता है और इसलिए यह मानता है कि परिभाषा किसी अन्य स्रोत फ़ाइल में मौजूद होना चाहिए। यह लिंकर है जो फ़ंक्शन परिभाषाओं के संदर्भ ढूंढने का प्रयास करता है, और इसलिए लापता परिभाषा लिंकर द्वारा रिपोर्ट की जाएगी।

ध्यान दें कि लिंकर केवल उन प्रतीकों जो अपने कार्यक्रम से उपयोग किया जाता है,
पूर्व के लिए लिंक करना होगा: आपके प्रोग्राम एक समारोह की घोषणा की है, तो कोई परिभाषा & तो कभी नहीं का उपयोग करता है प्रदान करता है/कहीं भी कॉल समारोह, लिंकर को उस पते पर कूदने के लिए कोड एम्बेड करने की आवश्यकता नहीं है जहां फ़ंक्शन के लिए ऑब्जेक्ट कोड किसी फंक्शन कॉल साइट पर रहता है।
इस तरह के एक परिदृश्य को देखते हुए लिंकर को फ़ंक्शन परिभाषा के लिए कभी भी देखने की आवश्यकता नहीं होगी। इसलिए कोड संकलित और लिंक होगा।

+5

आईएमएचओ, लिंकिंग त्रुटि तभी होगी जब लापता-परिभाषा वाले फ़ंक्शन का उपयोग स्पष्ट रूप से/स्पष्ट रूप से कहीं भी किया जा रहा हो। – fizzbuzz

+0

@fizzbuzz: हाँ, संभोग। वह मूल मानदंड है। –

+0

मुझे न तो कोई संकलन या लिंकिंग त्रुटि मिल रही है। बस जोड़ने के लिए मैं कहीं भी मस्ती का उपयोग नहीं कर रहा हूँ। कोड संकलित करता है और .lib फ़ाइल में ठीक से लिंक करता है। – akrohit

3

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

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

+0

एक फ़ाइल ** प्रति ** विधि? अत्यधिक लगता है ... –

+0

वास्तव में नहीं। यह बहुत कम bloat और आश्चर्यजनक लिंक मुद्दों के लिए बनाता है। कुछ आधुनिक कंपाइलर्स प्रत्येक फंक्शन को एक अलग ऑब्जेक्ट अनुभाग में बनाकर अनिवार्य बनाते हैं, लेकिन अधिकांश नहीं करते हैं। –

+0

मैंने दोबारा जांच की और उस विधि की परिभाषा नहीं मिली जिसे मैं ऊपर किसी अन्य फ़ाइल में बात कर रहा हूं। – akrohit

3

असाइनमेंट या कॉपी को रोकने के लिए यह एक आम तकनीक है। यदि आप इसे घोषित करते हैं लेकिन इसे परिभाषित नहीं करते हैं, तो यदि आप इसका उपयोग करने का प्रयास करते हैं तो एक लिंकिंग त्रुटि उत्पन्न होगी यानी लोग इसे अनजाने में उपयोग करते हुए

0

संकलक शिकायत नहीं करता है क्योंकि कोई वाक्यविन्यास/कंपाइलर त्रुटि नहीं है। लिंकर शिकायत नहीं करता है क्योंकि आप अपने प्रोग्राम में फ़ंक्शन को कॉल नहीं कर रहे हैं, इसलिए इसे लिंक करने की आवश्यकता नहीं है।

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