2010-06-29 10 views
11

मेरे पास एक बहुत ही अजीब सवाल है।सी ++ में कब (यह! = यह) है?

मैं एक वर्ग/समारोह है:

class MCBSystem { 

    [...] 

    template <class Receiver> 
    void setCallBack(int i, Receiver* receiver, void(Receiver::*function)(void*)) { 
     iCallBacks.at(i) = new CallBack<Receiver>(receiver, function, this); 
    }; 
}; 

और मैं यह (गुणा) के वारिस किसी अन्य वर्ग में:

class MenuBox : public OverlayBox, public HIDListener, public FANLib::MCBSystem { 
[...] 
}; 

अब, अगर मैं "setCallBack" फ़ंक्शन को कॉल करें:

 menuBox->setCallBack(MenuBox::CLICKED, this, &SubMain::widgetClicked); 

फिर "मेनूबॉक्स" का मान 0x06cficies8 कहता है लेकिन "setCallBack" के अंदर, "यह" 0x06cf2370 है।

कोई बता सकता है कि पृथ्वी पर क्या चल रहा है?

[संपादित करें:] सच्चा सवाल यह है: अगर मुझे 'सेट' को 'सेटकॉलबैक' के अंदर स्टोर करने की ज़रूरत है, तो मैं बाद में 'मेनूबॉक्स == यह' कैसे देख सकता हूं?

सलाह में बहुत धन्यवाद!

उत्तर

17

हां, this पॉइंटर को एकाधिक विरासत बहुरूपता की अनुमति देने के लिए पैच किया जाना है। ज़ीरोथ-ऑर्डर सन्निकटन के रूप में, वर्ग का एक उदाहरण जो A और B से प्राप्त होता है, का उदाहरण शामिल करने के बाद B का उदाहरण शामिल किया जा सकता है। अब यदि आपके पास C इंस्टेंस के लिए पॉइंटर है और B के उदाहरण में कनवर्ट करें, this पॉइंटर अलग होना चाहिए क्योंकि B इंस्टेंस मेमोरी में C इंस्टेंस के बाद स्थित है। गहन चर्चा के लिए this paper देखें।

लिटिल परीक्षण कार्यक्रम:

#include <iostream> 

struct A { int i; }; 
struct B { int j; }; 
struct C: A, B { }; 

#define PRINT(expr) std::cout << #expr " = " << expr << std::endl 

int main() { 
    C* c = new C; 
    B* b = c; 
    PRINT(b); 
    PRINT(c); 
    PRINT(static_cast<B*>(c)); 
} 
+1

फिर, मैं बाद में उस मेनू को कैसे देख सकता हूंबॉक्स == यह (जिसे 'सेटकॉलबैक' के अंदर संग्रहीत किया गया है ..? –

+4

मुझे लगता है कि यदि आप उन्हें एक सामान्य बेस क्लास में डाल देते हैं तो यह काम करना चाहिए। – Philipp

+0

सभी उत्तरों के लिए धन्यवाद। इसे हल करके हल करें: ((FANLib :: MCBSystem *) मेनूबॉक्स) == यह, और हाँ, यह काम करता है! –

1

एक वस्तु के लिए किसी भी सूचक को देखते हुए यह मूल्य जो कुछ भी यह करने के लिए डाला जाता है के आधार पर अलग-अलग होगा।

MenuBox के सदस्य फ़ंक्शन के भीतर, this प्रश्न में ऑब्जेक्ट के MenuBox भाग के लिए अंक।

हालांकि, setCallBack में, इसे ऑब्जेक्ट के Receiver भाग में पॉइंटर पर डाला जा रहा है।

दूसरे शब्दों में कहें करने के लिए, this हमेशा बराबर this, लेकिन किसी भी सूचक pstatic_cast<MenuBox>(p) होगा कभी नहीं बराबर static_cast<Receiver>(p) के लिए।

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