2014-04-08 14 views
45

जब मैं Cocos2dx 3.0 एपीआई पढ़ रहा था, मैं कुछ इस तरह चला:क्या "[इस]" सी में मतलब है ++

auto listener = [this](Event* event){ 
    auto keyboardEvent = static_cast<EventKeyboard*>(event); 
    if (keyboardEvent->_isPressed) 
    { 
     if (onKeyPressed != nullptr) 
      onKeyPressed(keyboardEvent->_keyCode, event); 
    } 
    else 
    { 
     if (onKeyReleased != nullptr) 
      onKeyReleased(keyboardEvent->_keyCode, event); 
    } 
}; 

[this] क्या मतलब है? C++11 में यह नया वाक्यविन्यास है?

+12

यह एक लैम्ब्डा है, और आप वर्तमान उदाहरण को बाध्य कर रहे हैं। – Zeta

+5

इसका मतलब है कि आप 'इस' को कैप्चर करते हैं। – rightfold

+1

क्या वास्तव में 'इस' का उल्लेख करने का कोई मुद्दा है? इसे स्वचालित रूप से 'onKeyPressed' और 'onReyeleased'' के संदर्भ में कैप्चर नहीं किया जाएगा (माना जाता है कि वे 'इस' के सदस्य हैं)। इसके अलावा एक चेतावनी, 'कीबोर्डइवेंट' अब' इस 'सूचक की एक प्रतिलिपि रख रहा है ... अगर आपको' कीबोर्ड 'जो कुछ भी इंगित कर रहा है, उसे बाहर निकालने का प्रबंधन करता है .... (मानक वस्तु जीवनकाल के मुद्दों) –

उत्तर

57

[इसका] क्या अर्थ है?

यह एक lambda - एक कॉल करने योग्य फ़ंक्शन ऑब्जेक्ट पेश करता है। ब्रैकेट्स में this डालने का अर्थ है कि लैम्ब्डा this कैप्चर करता है, ताकि इस ऑब्जेक्ट के सदस्य इसके भीतर उपलब्ध हों। लिंक किए गए पृष्ठ में वर्णित अनुसार लैम्बडास वैल्यू या रेफरेंस द्वारा स्थानीय वैरिएबल को भी कैप्चर कर सकता है।

लैम्ब्डा, operator() की एक अधिभार है इतना है कि यह एक समारोह की तरह कहा जा सकता है:

Event * event = some_event(); 
listener(event); 

जो कोड लैम्ब्डा के शरीर में परिभाषित चलेंगे।

क्या यह नया वाक्यविन्यास सी ++ 11 में है?

हां।

+0

मैं पीआईए नहीं बनना चाहता हूं, और वास्तव में दिलचस्पी है यदि शब्द "* ओवरलोड ऑफ ऑपरेटर()' * "तकनीकी रूप से सही है? मुझे पता है कि 'क्लोजरटाइप' एक प्रकार है और इसमें सदस्य फ़ंक्शन 'ऑपरेटर()' है, लेकिन मुझे लगता है कि यह किसी भी समय अधिभारित नहीं है, या है ना? – luk32

+1

@ luk32 यह अंतर्निहित ऑपरेटर को अधिभारित करता है, जैसे उपयोगकर्ता द्वारा घोषित ऑपरेटर ओवरलोड करता है। –

+0

ठीक है, यह ** ** हो सकता है कि जब हम किसी ऑपरेटर के बारे में बात कर रहे हों जिसे केवल वर्ग की विधि के रूप में घोषित किया जा सकता है, तो "ओवरलोडेड" नहीं है क्योंकि यह डिफ़ॉल्ट रूप से उस वर्ग के लिए परिभाषित नहीं है। हालांकि ऑपरेटरों के लिए यह आमतौर पर यह कहने के लिए स्वीकार किया जाता है कि उन्हें "अधिभारित" किया जा रहा है क्योंकि यह हमेशा किसी भी कॉल करने योग्य के बारे में कहा जाता है जिसे पहले से ही परिभाषित किया गया है। नतीजतन, प्रत्येक ऑपरेटर परिभाषा "अधिभार" है। – Ethouris

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