2012-09-13 10 views
6

मेरे पास एक ऐसा फ़ंक्शन है जो प्रत्येक विशेषता द्वारा ऑब्जेक्ट की तुलना करता है यह देखने के लिए कि वे समान हैं या नहीं। लेकिन मैं बस सोच रहा था, क्या ऑब्जेक्ट की तुलना उनके ऑब्जेक्ट से तुलना करना बेहतर होगा कि यह जांचने के बजाय कि वे बिल्कुल वही वस्तुएं हैं या नहीं?क्या आप समानता के लिए पते से वस्तुओं की तुलना कर सकते हैं?

+4

यदि दो वस्तुओं का एक ही पता है, तो वे वही हैं। यद्यपि यदि दो वस्तुओं में एक ही गुण हैं, तो वे जरूरी नहीं हैं ... – SinisterMJ

+7

ठीक है, क्या आप यह जांचना चाहते हैं कि ऑब्जेक्ट बराबर हैं, या वे एक ही वस्तु हैं या नहीं? यह वही नहीं है। – juanchopanza

+0

आह मुझे लगता है कि मैंने अपना शीर्षक गलत कहा है, मैं यह मांग रहा हूं कि वे एक ही वस्तु हैं और समान मूल्य वाले अलग-अलग वस्तुएं नहीं हैं; – user1527216

उत्तर

12

आप तय करना चाहिए कि क्या अपनी कक्षाओं तुल्यता या पहचान का समर्थन करने के लिए हैं। समतुल्यता मान, जैसे संख्याओं की विशिष्ट संपत्ति है। पहचान इकाइयों, जैसे लोगों की विशिष्ट संपत्ति है।

समानता आमतौर पर कक्षा के डेटा सदस्यों की तुलना करके निर्धारित की जाती है; पते की तुलना पहचान की जांच करने का एक उचित तरीका है।

+1

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

+2

हालांकि ऑप्टिमाइज़ेशन –

+0

के साथ अवधारणाओं को भ्रमित नहीं करते हैं, मुझे लगता है कि यह इस मामले में इसके लायक है, क्योंकि स्वयं में यह काम करता है कि दोनों अवधारणाओं के बीच संबंध दिखाता है: एक वस्तु हमेशा अपने आप के बराबर होनी चाहिए, अगर ऐसा नहीं है, तो आप कर रहे हैं यह गलत है। –

13

संपादित करें: सावधान रहें: यदि आप इसे सही तरीके से काम करना चाहते हैं तो आप अपने फ़ंक्शन पर मान (ऑब्जेक्ट) पास नहीं कर सकते हैं। आपको या तो (शायद कॉन्स) संदर्भ या पॉइंटर्स पास करने की आवश्यकता है।

bool AreEqual(const Class& a, const Class& b) 
{ 
    return &a == &b; 
} 

:

आप सिर्फ जानना चाहता दोनों संदर्भ या संकेत एक ही वस्तु (समान नहीं वस्तुओं, लेकिन एक ही) को इंगित कि क्या चाहते हैं, पतों की तुलना करना सही बात, वास्तव में है

ध्यान दें कि & ऑपरेटर को ऊपर Class कक्षा के लिए ओवरलोड किया जा सकता है। के बाद से सी ++ 11 समारोह टेम्पलेट std::addressof कि तथ्य से निपटने के लिए उपलब्ध है:

#include <memory> //std::addressof 
bool AreEqual(const Class& a, const Class& b) 
{ 
    return std::addressof(a) == std::addressof(b); 
} 
+0

समान नहीं है, लेकिन वही :)) अच्छा है। –

+0

@ लचियन ग्रिगोर शब्द ने "दोनों [ऑब्जेक्ट्स]" के पास गलत मोड़ लिया है यदि हम सख्त होना चाहते हैं :) – Kos

+0

@ कोस: अगर कोई जानता है कि अंग्रेजी में इसे सही तरीके से कैसे व्यक्त किया जाए, तो मैं खुशी से अपना जवाब अपडेट करूंगा :) – Gorpik

3

मुझे लगता है कि आप एक ही और समान के बीच एक उचित भेद करना लगता है।

एक ही पते पर इंगित करने वाले दो पॉइंटर्स का अर्थ है कि वे एक ही वस्तु को इंगित करते हैं। तो हाँ: एक ही पते का मतलब एक ही वस्तु है और इसलिए बराबर है (हालांकि समानता केवल तभी समझ में आती है जब हम 1 से अधिक ऑब्जेक्ट के बारे में बात करते हैं)।

वही गुणों का अर्थ एक ही वस्तु का जरूरी नहीं है। जैसे आपके पास दो उपयोगकर्ता "जॉन डो" नाम से दो उपयोगकर्ता हो सकते हैं। उनका प्रतिनिधित्व करने वाली वस्तुएं अभी भी अलग-अलग वस्तुएं होंगी, इसलिए इन्हें एक दूसरे के रूप में उपयोग नहीं किया जा सकता है। हालांकि, यदि आपके पास प्वाइंट क्लास है, तो {1, 2} के दो अलग-अलग उदाहरण वास्तव में एक ही चीज़ का प्रतिनिधित्व करते हैं और इन्हें एक दूसरे के रूप में उपयोग किया जा सकता है।

value objects और reference objects or entities के बीच अंतर का एक बड़ा मुद्दा है, इसलिए मैं इसे देखने का सुझाव देता हूं।

उदा। यदि आपके पास प्वाइंट क्लास है, तो {1, 2} के दो अलग-अलग उदाहरण वास्तव में एक ही चीज़ का प्रतिनिधित्व करते हैं, पहले उपयोगकर्ता उदाहरण के विपरीत।

2

यदि आपके पास ऑब्जेक्ट्स हैं जिनके लिए तुलना समय लेने वाली है, तो पॉइंटर्स की तुलना ऑब्जेक्ट समकक्ष निर्धारित करने के लिए एक तेज़ तरीका के रूप में उपयोग की जा सकती है (यानी, यदि पॉइंटर्स बराबर हैं, तो वस्तुएं बराबर हैं, अन्यथा वे बराबर हो सकते हैं)

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