2012-05-13 25 views
29

अधिक भार सबसे अच्छा अभ्यास (इस मामले में) है कौन सा:तुलना ऑपरेटर

bool Foo::operator==(const Foo& other) { 
    return bar == other.bar; 
} 

// Implementation 1 
bool Foo::operator!=(const Foo& other) { 
    return bar != other.bar 
} 

// Implementation 2 
bool Foo::operator!=(const Foo& other) { 
    return !(*this == other); 
} 

की तरह>, <, < =,> = ऑपरेटरों जब संभव हो मैं कार्यान्वयन 2 के साथ जाना होगा के लिए। हालांकि, के लिए! = मुझे लगता है कि कार्यान्वयन 1 बेहतर है क्योंकि एक और विधि कॉल नहीं किया गया है, क्या यह सही है?

+0

मैं इसे सही तरीके से व्यक्त करने का सबसे स्वाभाविक तरीका लिखूंगा। संकलक शायद इसे संकलित करने का एक अच्छा काम करने जा रहा है जिसे आप चुनते हैं। – Flexo

+0

ठीक है धन्यवाद। एक साइड नोट के रूप में, मुझे पता है कि अगर == रास्ता बहुत जटिल है, तो कार्यान्वयन 2 बेहतर होगा, लेकिन यह एक और मामला है। – blaze

+0

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

उत्तर

29

दूसरे कार्यान्वयन में उल्लेखनीय बाधा है कि == हमेशा != के विपरीत बुलियन होगा। यह शायद आप जो चाहते हैं, और यह आपके कोड को बनाए रखने में आसान बनाता है क्योंकि आपको सिंक में दोनों को रखने के लिए केवल एक कार्यान्वयन को बदलना होगा।

+7

और ग्रह पर प्रत्येक सी ++ कंपाइलर इनलाइन होगा! = = के लिए कॉल ==। – jthill

+1

@jthill सावधान रहें: यह नहीं होगा कि ऑपरेटर अभी तक परिभाषित नहीं है (उदा। स्रोत फाइलें)। – Tim

+3

@ टिम, अगर आपके कंपाइलर में एलटीओ हो सकता है। – zneak

11

तुलनात्मक ऑपरेटरों को अधिभारित करते समय आपको हमेशा अपने पास उपयोग करना चाहिए। केवल दो को आपको परिभाषित करने की आवश्यकता है operator== और operator<। शेष आप इन दोनों के संदर्भ में लिख सकते हैं। यह कम त्रुटि-प्रवण है, जैसे कि आपको कोई गलती है, यह केवल एक ही स्थान पर है।

ओओपी की मुख्य विशेषताओं में से एक कोड पुन: प्रयोज्यता है। यदि आप पहले ही कोड लिख चुके हैं, तो इसे फिर से क्यों लिखें? आपके पास जो कुछ है उसके लिए चिपकाएं, और आपके पास परीक्षण करने के लिए केवल एक चीज होगी।

यह निरंतर घोषित करने की तरह है, और फिर इसे अपनी फ़ाइल में कई स्थानों पर उपयोग करना है।

+0

असल में, आपको केवल 'ऑपरेटर <'' की आवश्यकता है। क्योंकि x == y तर्कसंगत रूप से बराबर है! (X mdenton8

+0

@ mdenton8, निश्चित रूप से, लेकिन यदि आप सभी तुलना ऑपरेटर चाहते हैं तो स्क्रैच से 'ऑपरेटर <' और 'ऑपरेटर ==' दोनों को परिभाषित करना मूर्खतापूर्ण है। कुछ सी ++ एसटीएल एल्गोरिदम और कंटेनर समानता के लिए 'ऑपरेटर ==' का उपयोग करेंगे और कुछ आपके द्वारा वर्णित तरीके से 'ऑपरेटर <' का उपयोग करेंगे। यह सच है कि यदि वे अलग-अलग चीजें करते हैं, तो कुछ निश्चित एल्गोरिदम का उपयोग करते समय आपके पास कुछ आश्चर्यजनक परिणाम हो सकते हैं। – chris

+0

सच है, यह अक्सर अधिक कुशल और अधिक स्पष्ट हो सकता है। लेकिन ऊपर उल्लिखित कारणों के लिए कम रखरखाव योग्य है। – mdenton8

4

कार्यान्वयन 2 बेहतर है क्योंकि यह पहले से परिभाषित ऑपरेटर == का उपयोग करता है। इसके अलावा उन ऑपरेटर फ़ंक्शंस const होना चाहिए क्योंकि वे ऑब्जेक्ट को संशोधित नहीं करते हैं।

+0

कॉन्स टिप – blaze

+0

के लिए धन्यवाद, मैं यह सुनिश्चित नहीं कर सकता कि मेरे सेटअप के बारे में क्या ठीक है (boost.optional, शायद) लेकिन मुझे 'stl_algobase.h: 808: 22: त्रुटि: त्रुटियों का बोतलबंद मिला है ' ऑपरेटर == ''जब तक मैंने कार्यों को' कॉन्स्ट 'घोषित नहीं किया, इसे इंगित करने के लिए धन्यवाद। – MatrixManAtYrService

1

सामान्य में, कार्यान्वयन 2 कई कारणों से बेहतर है। सबसे पहले, आप (लगभग) डुप्लिकेट कोड नहीं लिखते हैं। यदि आपको इसे बदलने की आवश्यकता है (क्योंकि कक्षा बढ़ी है या कोई बग है), फिर कार्यान्वयन के साथ 2 आप केवल 1 स्थान बदलते हैं। यही है, कार्यान्वयन 2 आपके कोड को अधिक सुसंगत और कम त्रुटि प्रवण बनाता है।

3

उपरोक्त में से कोई भी नहीं।

मेरी इच्छा है कि मैं उस कागज़ को पा सकूं जो वास्तव में विस्तार से इस पर हो जाता है लेकिन मुझे नाम याद नहीं है।

आपकी तुलना संचालन बाहरी होना चाहिए। ऑब्जेक्ट की स्थिति को ढूंढने के लिए आपका इंटरफ़ेस पर्याप्त होना चाहिए और ऑब्जेक्ट की स्थिति को तुलना करने की तुलना करना चाहिए। अपनी कक्षा के बाहर "बराबर" लिखना संभव है, और इस प्रकार वास्तव में कोई तुलना करना संभव है, और यह संभव है ... आप चाहते हैं।

+2

यह हमेशा सत्य नहीं है। ऐसे डिज़ाइन हो सकते हैं जिनमें आप सभी राज्यों तक पहुंच प्रदान नहीं करना चाहते हैं। फिर फिर, आप हमेशा दोस्ती के माध्यम से एक मुफ्त समारोह तक पहुंच प्रदान कर सकते हैं। –