Monday 15 April 2013

c++ - implicit conversion at call by value and polymorphism -


इस परिदृश्य पर विचार करें: कुछ बहुविध वर्ग:

  struct iClass {आभासी ~ iClass ( ) {}}; संरचना सामान्य क्लास: सार्वजनिक iClass {char str [128]; सामान्य क्लास () {...} ...}; Struct विशिष्ट क्लास: सार्वजनिक iClass {char str [32]; विशिष्ट क्लास () {...} विशिष्ट क्लास (विशिष्ट क्लास & src) {strcpy (...); ...} विशिष्ट क्लास (सामान्य क्लास & src) {strcpy (...); ...} विशिष्ट क्लास (कॉन्स्ट कॉमनक्लास & src) {strcpy (...); ...} शून्य foo () {...}};   

इसके अलावा एक फ़ंक्शन:

  कुछ फ़नूक रहित (विशिष्ट वर्ग स्क) {sc.foo (); } // मूल्य से पास: मैं इसे कॉपी करना चाहता हूं! Int main () {कॉमनक्लास comCl; someFunc (comCl); // & lt; - त्रुटि: कॉल करने के लिए 'विशिष्ट क्लास :: विशिष्ट क्लास (विशिष्ट क्लास)' के लिए कोई मेल नहीं खाता 'नोट: नहीं & amp; विशिष्ट क्लास स्पेकक्ल (comCl); someFunc (specCl); // सामान्य काम करता है, लेकिन str इस तरह दो बार नकल की जाती है, है ना? वापसी 0; }   

क्यों कंपाइलर पहली फ़ंक्शन कॉल में आम क्लास से विशिष्ट क्लास से रूपांतरण की अनुमति नहीं देता है, हालांकि एक नए विशिष्ट क्लास को वैसे भी कॉल पर तैयार किया जाता है और इस विशिष्ट रूपांतरण के लिए एक कन्स्ट्रक्टर है? और मुझे यह अजीब त्रुटि संदेश क्यों मिलता है? संदर्भ के बिना प्रतिलिपि कन्स्ट्रक्टर को कॉल करें? क्या कोई इस समस्याग्रस्तता में कुछ अंतर्दृष्टि साझा कर सकता है?

बीटीडब्ल्यू, मुझे जीसीसी 4.1.2

कुछ फंक को एक प्रकार की तर्क विशिष्ट क्लास की आवश्यकता है, और आप एक प्रकार CommonClass प्रदान करते हैं। चूंकि आपने एक रूपांतरण कन्स्ट्रक्टर परिभाषित किया है

  SpecificClass :: विशिष्ट क्लास (कॉमनक्लास एंड)   

इस रूपांतरण को बेतरतीब ढंग से किया जा सकता है, और वह अब तक बहुत अच्छा है।

[ध्यान दें, हालांकि, ध्यान दें कि आपका कनवर्ज़न कन्स्ट्रक्टर एक गैर-कॉन्स्ट्रेंट संदर्भ लेता है, जो यहां काम करता है क्योंकि आप वास्तव में इसे लावलू के साथ प्रदान करते हैं - हालांकि, सामान्य तौर पर, मैं मानता हूं कि const सामान्य क्लास के रूप में कनवर्ज़न कन्स्ट्रक्टर और आमतौर पर बेहतर होता है (चूंकि एक प्रकार से दूसरे प्रकार का रूपांतरण आमतौर पर मूल को बदलने की उम्मीद नहीं है)।

हालांकि, समस्या अगले चरण में होती है: फ़ंक्शन तर्क के sc में someFunc में विशिष्ट क्लास की प्रतिलिपि बनाई गई वस्तु का ताजा रूपांतरण किया गया है कोड>। इसके लिए आपको विशिष्ट क्लास के लिए प्रतिलिपि कन्स्ट्रक्टर की आवश्यकता होती है, जो एक रैवल्यू ले सकते हैं (यह ताज़ा रूप से परिवर्तित SpecificClass ऑब्जेक्ट है, क्योंकि यह अस्थायी है)।

आपकी कॉपी कन्स्ट्रक्टर

  SpecificClass :: विशिष्ट क्लास (विशिष्ट क्लास & amp;)   

को गैर-कॉन्स्ट लेवल्यू संदर्भ लेने की घोषणा की गई है, जो बाइंड नहीं कर सकता अस्थायी रूप से इसलिए आपको इस समस्या को ठीक करने के लिए

  विशिष्ट क्लास :: विशिष्ट क्लास (कॉन्स्ट विशिष्ट क्लास & amp;)   

में बदलना होगा। और यह एक कॉपी कन्स्ट्रक्टर घोषित करने का सामान्य तरीका है।


एक और चीज जो मैं ध्यान देने में मदद नहीं कर पा रहा हूं: आपके पास एक फ़ंक्शन है someFunc जिसका अर्थ है केवल एक विशिष्ट प्रकार की वस्तुओं पर ही फिर भी आप इसे एक सामान्य (आधार वर्ग?) प्रकार पर कहते हैं जाहिर है, यह आपके द्वारा वर्णित तरीके से काम करने के लिए किया जा सकता है, लेकिन यह कई तरह से विपरीत-सहज ज्ञान युक्त है और ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के सिद्धांत के अनुरूप नहीं है। यह भी मुझे आश्चर्य बनाता है कि 'विशिष्ट' ऑब्जेक्ट को वास्तव में 'सामान्य' से बनाया गया है, यानी रूपांतरण निर्माता वास्तव में क्या करता है। Intuitively, मैं 'सामान्य' वस्तु ग्रहण के रूप में इनपुट '' विशिष्ट 'वस्तु बनाने के लिए' विशिष्ट जानकारी का अभाव माना जाता है।

किसी भी मामले में, आप अपने वर्ग पदानुक्रम की संरचना पर पुनर्विचार करना चाहते हो सकता है और / या someFunc के उद्देश्य इनमें से कोई भी सीधे आपके प्रश्न में वर्णित समस्या से संबंधित नहीं है, हालांकि।

No comments:

Post a Comment