2009-01-28 7 views
5

मैं इस तरह लाइनों के साथ कुछ पुराने प्रबंधित सी ++ कोड अपडेट कर रहा हूँ:घटनाओं के लिए सदस्यता लेने के लिए सी ++/सीएलआई वाक्यविन्यास क्या है?

instanceOfEventSource->add_OnMyEvent( 
    new EventSource::MyEventHandlerDelegate(this, MyEventHandlerMethod)); 

जहां

  • EventSource वर्ग कि घटनाओं
  • प्रकाशित करता है
  • instanceOfEventSource कि का एक उदाहरण है कक्षा
  • इवेंटसोर्स :: MyEventHandlerDelegate घटना
  • MyEventHandlerMethod के लिए प्रतिनिधि प्रकार एक (गैर स्थिर) वर्तमान वर्ग के भीतर विधि (जिनमें से "इस" एक उदाहरण है) हस्ताक्षर मिलान EventSource साथ है :: MyEventHandlerDelegate

सी ++/सीएलआई में इसके लिए सही वाक्यविन्यास क्या है?

उत्तर

6

वाक्य रचना सी # के लिए समान है, दूसरे शब्दों में, += यह संभव बनाने के लिए ओवरलोड हो गया है: हटाने के लिए

instanceOfEventSource.MyEvent += 
    gcnew EventSource::MyEventHandlerDelegate(this, &MyClass::MyEventHandlerMethod); 

Analogously। सी # के विपरीत, हालांकि, आप ईवेंट हैंडलर प्रतिनिधि के स्पष्ट तत्कालता को छोड़ नहीं सकते हैं, इसलिए यह काफी लंबे हवादार कोड का उत्पादन करता है।

+0

मैं gcnew उपयोग करने के लिए किया था, और मैंने यह भी पाया मैं "@MyClass :: MyEventHandlerMethod" बस "MyEventHandlerMethod" के बजाय लिखना पड़ा। लेकिन यह मुझे ले गया जहां मुझे जाने की जरूरत है - धन्यवाद !! – Eric

+1

'gcnew' के बारे में, मैंने अभी कोड के इस हिस्से को नहीं बदला है। और विधि के बारे में भी सही है। : -/ –

+0

क्या आप [gcnew] (http://msdn.microsoft.com/en-us/library/te3ecsc8 (VS.80) .aspx का उपयोग नहीं कर रहे हैं)? –

1

मैंने एक आधे घंटे बिताए कि एक घटना के लिए कॉलबैक विधि के रूप में स्थिर विधि को कैसे पंजीकृत किया जाए। जबकि ओपी ने विशेष रूप से स्थैतिक तरीकों को पंजीकृत करने के लिए नहीं कहा था, यह दूसरों को एक ही समस्या का सामना करने में मददगार होगा। यह वास्तव में बहुत आसान है, उस मामले में प्रतिनिधि कन्स्ट्रक्टर स्थिर लक्ष्य विधि के लिए केवल एक पैरामीटर लेता है।

उदाहरण:

System::EventHandler^ h = gcnew System::EventHandler(&MyClass::MyStaticCallbackMethod); 
संबंधित मुद्दे