2010-06-21 12 views
14

मैं कुछ इस तरह कोशिश कर रहा हूँ:क्या सी ++ असाइनमेंट ऑपरेटर मुफ्त फ़ंक्शन हो सकते हैं?

Foo & operator=(Foo & to, const Bar &from); 

लेकिन मैं इस त्रुटि हो रही है:

E2239 'operator =(Foo &, const Bar &)' must be a member function 

वहाँ सीमाओं जिस पर ऑपरेटरों/नि: शुल्क के रूप में कार्य परिभाषित नहीं किया जा सकता कर सकते हैं कर रहे हैं, और यदि हां , क्यूं कर?

उत्तर

22

असाइनमेंट ऑपरेटर एक गैर स्थिर सदस्य समारोह होना चाहिए और वास्तव में एक पैरामीटर होना चाहिए:

An assignment operator shall be implemented by a non-static member function with exactly one parameter (C++03 13.5.3/1).

operator(), operator[], और operator-> भी गैर स्थिर सदस्य कार्यों के रूप में लागू किया जाना चाहिए।

कक्षा-विशिष्ट operator new और operator delete (और उसके वेरिएंट) (, ध्यान रहे कि ये परोक्ष स्थिर हैं, भले ही वे static कीवर्ड के साथ घोषित नहीं कर रहे हैं) स्थिर सदस्य कार्यों के रूप में लागू किया जाना चाहिए।

+2

ऐसा करने के लिए कोई और कारण? यह ऑपरेटर = सदस्य कार्य करने के लिए समझ में आता है, आखिरकार, यह 'तीन' प्रतिलिपि नियंत्रण कार्यों में से एक है (अर्थात् कॉपी कन्स्ट्रक्टर, ऑपरेटर = और विनाशक)। लेकिन दूसरों के लिए क्यों? – zoujyjs

+1

@zoujyjs ऑपरेटरों के पास आंतरिक सदस्य चर (संभवतः निजी) वाले लोगों तक पहुंच होनी चाहिए। नि: शुल्क कार्यों में ऐसी पहुंच नहीं होगी। – iheanyi

+0

@hiheanyi लेकिन हम मुक्त कार्य को कक्षा –

-1

यह नहीं कर सकता।

कारण, मुझे लगता है कि कॉपी कन्स्ट्रक्टर के साथ करना है। उनके पास बहुत ही समान अर्थशास्त्र हैं, और, आप अन्य कन्स्ट्रक्टर की तरह किसी वर्ग के बाहर एक कॉपी कन्स्ट्रक्टर को परिभाषित नहीं कर सकते हैं। तो, वे जुड़वां विरोधाभास से बचने के लिए जुड़वां दूर अलग नहीं करना चाहते थे :)।

पीएस सी ++ में शर्म की बात यह है कि आप मौजूदा वर्ग में सदस्य नहीं जोड़ सकते हैं। इसके लिए कोई निम्न स्तर का कारण नहीं है। यदि यह संभव होगा, तो आप श्रेणी परिभाषा शीर्षलेख में निजी कार्यों की घोषणा न करके हेडर और सीपीपी निर्भरताओं को रद्द कर सकते हैं।

+5

यदि आप कक्षा की परिभाषा पूरी होने के बाद सदस्यों को जोड़ रहे हैं, तो निश्चित रूप से इसके कारण हैं। आप वर्चुअल सदस्यों को बाद में नहीं जोड़ सकते क्योंकि क्लास परिभाषा के समय तक संकलक को पता होना चाहिए कि ऑब्जेक्ट (vtable! सहित) कितना बड़ा है। कक्षा परिभाषा के बाहर गैर-वर्चुअल सदस्यों को जोड़ने से 'निजी' व्यर्थ हो जाएगा क्योंकि कोई भी उन सदस्यों को जोड़ने में सक्षम होगा जो निजी डेटा की जांच/संशोधित हैं। पूरी तरह से सी ++ के संदर्भ में, यह उन चीज़ों को तोड़ देगा जो वे हासिल करने की कोशिश कर रहे थे। –

+0

ठीक है, पहले सार्वजनिक सदस्यों को जोड़ने के लिए अच्छा हो सकता है। दूसरा, सबसे महत्वपूर्ण बात यह है कि इसे कक्षा परिभाषा में केवल "मित्र" या किसी प्रकार की अग्रेषित घोषणा की आवश्यकता होगी, जो निर्भरताओं को कम करने में मदद करेगा। –

+0

मैं सी ++ में 'शर्म' के बारे में आपके बिंदु का पालन नहीं करता हूं। यदि आप वास्तव में मौजूदा कक्षा में कुछ जोड़ना चाहते हैं, तो क्यों न केवल उप-वर्ग बनाएं? इसके बजाए, यदि आपका इरादा पूरी तरह कार्यान्वित होने के बाद मूल वर्ग को 'संशोधित' करना है, तो मुझे नहीं लगता कि सी ++ काम करता है। – Diaz

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