वर्चुअल सदस्य फ़ंक्शंस के विपरीत व्युत्पन्न क्लास सदस्य फ़ंक्शन पॉइंटर को कैसे पंजीकृत करें, मुझे एक ऐसे समाधान की आवश्यकता है जहां प्रत्येक स्तर के क्लास व्युत्पन्न पर लागू एक फ़ंक्शन बेस क्लास द्वारा बाद में कॉल के लिए पंजीकृत किया जा सके। (न केवल सबसे व्युत्पन्न कार्यान्वयन)बेस क्लास
ऐसा करने के लिए, मैं व्युत्पन्न कक्षाओं के लिए अपने कार्य को पंजीकृत करने के लिए व्युत्पन्न कक्षाओं के लिए एक तंत्र प्रदान करने पर विचार कर रहा था जैसे कि व्युत्पन्न वर्ग निर्माता के दौरान।
मुझे सदस्य फ़ंक्शन पॉइंटर तर्क के साथ समस्या हो रही है। मैं सोच रहा था कि व्युत्पन्न बेस से लिया गया है, this
पॉइंटर स्वचालित रूप से डाला जाना चाहिए।
क्या यह मेरी कोशिश के करीब किया जा सकता है या क्या मुझे स्थिर सदस्य कार्य, void *
, और static_cast
का उपयोग करने की आवश्यकता है?
class Base
{
protected:
typedef void (Base::*PrepFn)(int n);
void registerPrepFn(PrepFn fn) {};
}
class Derived : public Base
{
Derived() {
registerPrepFn(&Derived::derivedPrepFn);
};
void derivedPrepFn(int n) {};
}
संकलक त्रुटि:
error: no matching function for call to 'Derived::registerPrepFn(void (Derived::*)(int))'
note: candidates are: 'void Base::registerPrepFn(void (Base::*)(int))'
मुझे यकीन नहीं है कि आप वास्तव में क्या करना चाहते हैं। लेकिन यह निश्चित रूप से इस तरह से संभव नहीं है; 'व्युत्पन्न' में परिभाषित एक सदस्य फ़ंक्शन को 'बेस :: *' द्वारा इंगित नहीं किया जा सकता है। शायद यदि आप शीर्ष-स्तरीय लक्ष्य की व्याख्या करते हैं, तो कोई बेहतर समाधान सुझा सकता है। –
एफटीआर, 'शून्य *' और 'static_cast' या तो काम नहीं करेगा, क्योंकि सदस्य फ़ंक्शन का सूचक सूचक नहीं है (हां, यह बहुत ही नामित है)। –
स्थिर कलाकारों के संबंध में, मैं सोच रहा था कि मैं स्थिर सदस्य कार्यों को कार्यान्वित कर सकता हूं और स्पष्ट रूप से इस सूचक – NoahR