फ़ंक्शन पॉइंटर्स का उपयोग करने में कुछ भी गलत नहीं है। हालांकि, गैर-स्थैतिक सदस्य फ़ंक्शन के लिए संकेत सामान्य फ़ंक्शन बिंदुओं की तरह नहीं हैं: सदस्य कार्यों को किसी ऑब्जेक्ट पर कॉल करने की आवश्यकता होती है जो फ़ंक्शन के लिए एक अंतर्निहित तर्क के रूप में पारित किया जाता है। इस प्रकार आपके सदस्य कार्य का हस्ताक्षर इस प्रकार है
void (aClass::*)(int, int)
उस प्रकार के बजाय जिसका आप उपयोग करने का प्रयास करते हैं
void (*)(int, int)
एक दृष्टिकोण सदस्य कार्य करने static
में शामिल हो सकता है जिस स्थिति में इसे किसी भी वस्तु को कॉल करने की आवश्यकता नहीं होती है और आप इसे प्रकार के साथ उपयोग कर सकते हैं void (*)(int, int)
।
यदि आपको अपनी कक्षा के किसी भी गैर-स्थैतिक सदस्य तक पहुँचने की आवश्यकता है और आपको फ़ंक्शन पॉइंटर्स के साथ चिपके रहने की आवश्यकता है, उदाहरण के लिए, क्योंकि फ़ंक्शन सी इंटरफ़ेस का हिस्सा है, तो आपका सबसे अच्छा विकल्प void*
फ़ंक्शन फ़ंक्शन और कॉल करने के लिए हमेशा अपने फ़ंक्शन को पास करना है। एक अग्रेषण फ़ंक्शन के माध्यम से आपका सदस्य जो किसी वस्तु को प्राप्त करता हैvoid*
और फिर सदस्य फ़ंक्शन को कॉल करता है।
एक उचित C ++ इंटरफ़ेस में, आप चाहते हैं कि आपके फ़ंक्शन को फ़ंक्शन ऑब्जेक्ट्स के लिए मनमाना वर्ग प्रकारों का उपयोग करने के लिए अस्थायी तर्क ले सकें। यदि टेम्प्लेटेड इंटरफ़ेस का उपयोग करना अवांछनीय है, तो आपको कुछ इस तरह का उपयोग करना चाहिए std::function<void(int, int)>
: आप इन के लिए एक उपयुक्त कॉल करने योग्य फ़ंक्शन ऑब्जेक्ट बना सकते हैं, जैसे, उपयोग करना std::bind()
।
वर्ग प्रकार या उपयुक्त के लिए टेम्प्लेट तर्क का उपयोग करने वाले प्रकार-सुरक्षित दृष्टिकोण एक std::function<...>
का उपयोग करने की तुलना में बेहतर हैंvoid*
इंटरफ़ेस क्योंकि वे गलत प्रकार के कलाकारों के कारण त्रुटियों की क्षमता को दूर करते हैं।
सदस्य फ़ंक्शन को कॉल करने के लिए फ़ंक्शन पॉइंटर का उपयोग कैसे करें, यह स्पष्ट करने के लिए, यहां एक उदाहरण है:
// the function using the function pointers:
void somefunction(void (*fptr)(void*, int, int), void* context) {
fptr(context, 17, 42);
}
void non_member(void*, int i0, int i1) {
std::cout << "I don't need any context! i0=" << i0 << " i1=" << i1 << "\n";
}
struct foo {
void member(int i0, int i1) {
std::cout << "member function: this=" << this << " i0=" << i0 << " i1=" << i1 << "\n";
}
};
void forwarder(void* context, int i0, int i1) {
static_cast<foo*>(context)->member(i0, i1);
}
int main() {
somefunction(&non_member, 0);
foo object;
somefunction(&forwarder, &object);
}