2012-02-15 10 views
7

मेरे पास पॉलिमॉर्फिक प्रकार के दो उदाहरणों के लिए आधार * पॉइंटर्स हैं और मुझे यह निर्धारित करने की आवश्यकता है कि संदर्भित वस्तुएं बराबर हैं या नहीं।क्या ऑब्जेक्ट समतुल्य के लिए पॉलिमॉर्फिक प्रकार की तुलना करने के लिए सी ++ में एक मूर्खतापूर्ण दृष्टिकोण है?

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

क्या कोई और मूर्खतापूर्ण दृष्टिकोण है?

+1

आप के अनुसार बराबर वस्तुओं रहे हैं क्या? –

+0

व्युत्पन्न कक्षाओं में से अधिकांश के लिए, समतुल्य का मतलब है कि सदस्य सभी समान मानों को चर करता है। – RandomBits

+0

यह प्रश्न संबंधित हो सकता है: http://stackoverflow.com/questions/1691007/whats-the-right-way-to-overload-operator-for-a-class-hierarchy –

उत्तर

6

व्युत्पन्न वर्ग से ज्यादातर के लिए, बराबर का अर्थ है कि सदस्य चर सभी एक ही मूल्य

C++ में इस 'समानता' कहा जाता है और आम तौर पर operator==() का उपयोग कर कार्यान्वित किया जाता है।

MyType A; 
MyType B; 
if (A == B) { 
    // do stuff 
} 

और == कॉल आपके द्वारा निर्धारित एक कस्टम समारोह है: सी ++ आप ऑपरेटरों के अर्थ ओवरराइड कर सकते हैं के लिए, यह लिखने के लिए संभव है।

मुझे लगता है कि आप पहचान से समानता को अलग करना चाहते हैं जिसका अर्थ एक ही वस्तु (यानी एक ही पता) होगा।

आप सदस्य समारोह या मुक्त समारोह (विकिपीडिया से) के रूप में इसे लागू कर सकते हैं:

bool T::operator ==(const T& b) const; 
bool operator ==(const T& a, const T& b); 

अपने मामले में आप आधार वर्ग के लिए operator== लागू करना चाहते हैं, और उसके बाद प्रदर्शन करते हैं कि आप क्या कर रहे हैं।

अधिक वस्तुतः यह इस तरह दिखेगा:

class MyBase 
{ 
    virtual ~MyBase(); // reminder on virtual destructor for RTTI 
    // ... 
private: 
    virtual bool is_equal(const MyBase& other); 

    friend bool operator ==(const MyBase& a, const MyBase& b); 

    // ...  
}; 

bool operator ==(const MyBase& a, const MyBase& b) 
{ 
    // RTTI check 
    if (typeid(a) != typeid(b)) 
     return false; 
    // Invoke is_equal on derived types 
    return a.is_equal(b); 
} 


class D1 : MyBase 
{ 
    virtual bool is_equal(const Base& other) 
    { 
     const D1& other_derived = dynamic_cast<const D1&>(other); 
     // Now compare *this to other_derived 
    } 
}; 

class D2 : MyBase; 
{ }; 


D1 d1; D2 d2; 
bool equal = d1 == d2; // will call your operator and return false since 
         // RTTI will say the types are different 
+0

'ऑपरेटर == 'फ़ंक्शन में, मैं दो ऑब्जेक्ट्स की तुलना करने के लिए वर्चुअल फ़ंक्शन को कॉल करना चाहता हूं। तुलनात्मक कार्य का हस्ताक्षर 'वर्चुअल बूल is_equal (MyBase Const &)' जैसा होना चाहिए। ऐसा लगता है कि व्युत्पन्न ऑब्जेक्ट प्रकार पर जाने के लिए 'is_equal' के कार्यान्वयन में स्पष्ट गिरावट की आवश्यकता है। – RandomBits

+0

हां यह हस्ताक्षर होना चाहिए। (क्षमा करें, संपादित करें) हां इसे एक कलाकार की आवश्यकता है। आप निर्दिष्ट कर सकते हैं कि एक ही प्रकार में किसी वस्तु के साथ 'is_equal' को कॉल किया जाना चाहिए, इसे निजी बनाएं ताकि केवल '==' इसे कॉल कर सके (उस स्थिति में आपको अपने ऑपरेटर को मित्र के रूप में घोषित करने की आवश्यकता है)। –

+0

आप अपने संपादन में "मित्र" भाग भूल गए हैं और 'आभासी'। मैंने इसे जोड़ा है (लेकिन परीक्षण नहीं किया गया है)। –

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

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