2012-01-19 7 views
8

में गतिशील रूप से फ़ंक्शन को कॉल करने के लिए कैसे करें (बाइंड फ़ंक्शन) के अलावा, मैं सी ++ में गतिशील रूप से फ़ंक्शन कैसे कॉल कर सकता हूं?सी ++

पीएचपी है:

$obj = new MyObject(); 
$function = 'doSomething'; 
$obj->$function(); 

ऑब्जेक्टिव-सी है:

MyObject *obj = [[MyObject alloc] init]; 
SEL function = NSSelectorFromString(@"doSomething"); 
[obj performSelector: function]; 
+0

http://stackoverflow.com/questions/11016078/is-it-possible:

void *handle = dlsym(0, RTLD_LOCAL | RTLD_LAZY); FunctionType *fptr = (FunctionType *)dlsym(handle, "hello"); fptr(); 

कुछ चीजें निर्वासन 'सी' के एक झुंड हैं हुड के नीचे होता है, इसलिए यहाँ एक छोटी सूची है -to-create-a-function-गतिशील-दौरान-रनटाइम-इन-सी – dtech

+0

संबंधित खोज कीवर्ड: C++ में "आभासी फ़ंक्शन" और "देर से बाध्यकारी या गतिशील बाध्यकारी" की तलाश करें। सी में "काम करने के लिए सूचक"। – lepe

उत्तर

2

उन कार्यों आप एक ही प्रकार के होते हैं में रुचि रखते हैं, तो आप तार और समारोह संकेत के नक्शे बना सकते हैं।

+0

इसका मतलब यह होगा कि मुझे सूची को अद्यतित रखने की आवश्यकता है। मैं और अधिक स्वचालित खोज रहा हूँ। – joels

+0

आप इसे उत्पन्न करने के लिए कुछ प्रोग्राम का उपयोग कर सकते हैं (शायद अंत में थोड़ा सा सीट के साथ भी ctags) – stralep

+0

@joels - कोड उत्पन्न करना आसान है। – dtech

2

सरल उत्तर यह है कि आप नहीं कर सकते। सी ++ नाम से विधि को नहीं देखता है।

+1

गलत, आप नाम से डीएलएल कार्यों को देख सकते हैं। – dtech

+2

@ddriver DLLs C++ का हिस्सा नहीं हैं, और डीएलएल फ़ंक्शन सी ++ विधियां नहीं हैं। – Roddy

+0

@ रोडी - आप सी ++ को डीएलएल में संकलित कर सकते हैं और नाम लुकअप द्वारा फ़ंक्शन में पॉइंटर प्राप्त कर सकते हैं। विंडोज़ पर डीएलएल, लिनक्स पर, जो भी हो, आप नाम से गतिशील पुस्तकालयों में कार्यों को देख सकते हैं, यह एक तथ्य है। – dtech

8

आप आवश्यक कार्यों निर्यात (उनमें __dllexport साथ चिह्नित करके जैसे) और उनके पते प्राप्त करने के लिए GetProcAddress या dlsym (अपने मंच पर निर्भर करता है) का उपयोग कर सकते हैं:

 

void *handle = dlsym(0, RTLD_LOCAL | RTLD_LAZY); 
FunctionType *fptr = (FunctionType *)dlsym(handle, "doSomething"); 
fptr(); 
 
 

HANDLE handle = GetCurrentProcess(); 
FunctionType *fptr = (FunctionType *)GetProcAddress(handle, "doSomething"); 
fptr(); 
 

यह सब प्लेटफ़ॉर्म-विशिष्ट है हालांकि ऐसा करने के लिए सी ++ में कोई मानक तरीका नहीं है।

+3

शिकायत नहीं कर सकता, यह एक अच्छा जवाब है।हालांकि मैं यह इंगित करूंगा कि सी कार्यों के लिए गतिशील कॉल के लिए यह बहुत अच्छा है, और पॉलिमॉर्फिक सी ++ विधि कॉल के लिए काम नहीं करेगा। –

+0

@ ग्राहमपर्क्स: ठीक है, यह मैंगलिंग, ऑब्जेक्ट पॉइंटर्स को समायोजित करने और जैसे, जैसे पूरी तरह से असंभव नहीं है, इस तरह की चीजों के साथ और भी अधिक प्लेटफार्म-विशिष्ट होगा। हालांकि, मुझे संदेह है कि मैं कभी भी उत्पादन वातावरण में ऐसी चीज करूंगा। –

+1

संकलन के दौरान नामों को रोकने से रोकने के लिए घोषणाओं में आप उन कार्यों को भी चिह्नित कर सकते हैं जिन्हें आप बाहरी "सी" के साथ संदर्भित करना चाहते हैं। बाहरी "सी" शून्य हैलो() { std :: cout << "हैलो \ n"; } इससे आपको नाम से अपना कार्य कॉल करने की अनुमति मिल जाएगी। शून्य * हैंडल = dlsym (0, RTLD_LOCAL | RTLD_LAZY); फ़ंक्शनटाइप * fptr = (फ़ंक्शनटाइप *) dlsym (हैंडल, "हैलो"); fptr(); यहां बाहरी "सी" हुड के नीचे क्या है: http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c – deadbabykitten

2

यदि मैं आपका प्रश्न ठीक से समझ गया, आप सी ++ में फ़ंक्शन पॉइंटर (या सदस्य के लिए सूचक) का उपयोग कर सकते हैं। आप गतिशील रूप से तय कर सकते हैं कि कौन सा फ़ंक्शन कॉल (आपको इसके प्रोटोटाइप की आवश्यकता हो सकती है) और इसे गतिशील रूप से कॉल करें। इस लिंक

https://isocpp.org/wiki/faq/pointers-to-members

2

सवाल का Konstantin Oznobihin के जवाब में विस्तार करते हुए देखते हैं, आप संकलन के दौरान नाम mangling से संकलक को रोकने के लिए C++ कार्यों आप घोषणा में निर्वासन 'सी' के साथ संदर्भित कर रहे हैं चिह्नित कर सकते हैं।

extern "C" void hello() { 
    std::cout << "Hello\n"; 
} 

इससे आपको अपने ऑब्जेक्ट/फ़ंक्शन को उस नाम से कॉल करने की अनुमति मिल जाएगी जिसे आपने शुरू में दिया था। इस मामले में यह 'हैलो' है। In C++ source, what is the effect of extern "C"?

+0

कृपया संपादित करें और इसे @ कॉन्स्टेंटिन ओज़नोबिहिन के उत्तर में जोड़ें। वैसे भी, अच्छी टिप के लिए धन्यवाद। – Jet