ফাংশন পয়েন্টার ব্যবহার করে কোনও সমস্যা নেই। যাইহোক, অ স্থিতিশীল সদস্য ফাংশনগুলিতে পয়েন্টারগুলি সাধারণ ফাংশন পয়েন্টারগুলির মতো নয়: ফাংশনের অন্তর্নিহিত যুক্তি হিসাবে পাস হওয়া কোনও বস্তুর উপরে সদস্য ফাংশনগুলি কল করা দরকার। উপরে আপনার সদস্য ফাংশনের স্বাক্ষর এইভাবে
void (aClass::*)(int, int)
আপনি যে ধরণের ব্যবহার করার চেষ্টা করছেন তার চেয়ে বরং
void (*)(int, int)
একটি পদ্ধতির সদস্য ফাংশনটি তৈরির static
ক্ষেত্রে এমন কোনও বিষয় থাকতে পারে যাতে এটির জন্য কোনও বস্তুর প্রয়োজন হয় না এবং আপনি এটি টাইপ দিয়ে ব্যবহার করতে পারেন void (*)(int, int)
।
আপনার ক্লাসের কোনও অ-স্থিতিশীল সদস্যের অ্যাক্সেসের প্রয়োজন হলে এবং আপনাকে ফাংশন পয়েন্টারগুলির সাথে লেগে থাকা প্রয়োজন, উদাহরণস্বরূপ, ফাংশনটি একটি সি ইন্টারফেসের অংশ হিসাবে, আপনার সর্বোত্তম বিকল্পটি সর্বদা void*
আপনার ফাংশনটিতে ফাংশন পয়েন্টার এবং কল গ্রহণের মাধ্যমে একটি পাস করা হয় আপনার সদস্য একটি ফরোয়ার্ডিং ফাংশন মাধ্যমে যা একটি থেকে একটি বস্তু গ্রহণ করে void*
এবং তারপর সদস্য ফাংশন কল।
একটি যথাযথ সি ++ ইন্টারফেসে আপনি নিজের ফাংশনটি স্বেচ্ছাসেবী শ্রেণীর ধরণের ব্যবহারের জন্য ফাংশন অবজেক্টগুলির জন্য টেম্পলেটযুক্ত যুক্তি গ্রহণ করতে চান। যদি কোনও টেম্প্লেটড ইন্টারফেস ব্যবহার করা অযাচিত হয় তবে আপনার এমন কিছু ব্যবহার করা উচিত 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);
}