मेरे पास एक वर्ग है जिसे मैं पैरामीटर के बिना निर्माण करते समय इंगित करने के लिए एक डिफ़ॉल्ट फ़ंक्शन रखना चाहता हूं, लेकिन मैं चाहता हूं कि पैरामीटर में से किसी एक के साथ फ़ंक्शन पास होने पर कार्यक्षमता बदल जाए।
मुझे त्रुटि मिल रही है "प्रकार का एक मान" int (MyClass :: *) (int myVar)" को "MyClass :: funcptr" प्रकार की इकाई को असाइन नहीं किया जा सकता है, लेकिन ऐसा लगता है कि डिफ़ॉल्ट फ़ंक्शन को परिभाषा से मेल खाना चाहिए फ़ंक्शन पॉइंटर। मैंने इसके साथ कुछ समय तक संघर्ष किया और मुझे यह समझने में परेशानी हो रही है कि यहां क्या समस्या है। किसी भी मदद की सराहना की जाती है।
--MyClass.h--
class MyClass{
private:
typedef int (*funcptr)(const int myVar);
funcptr myfuncptr;
int defaultFunc(int myVar);
public:
MyClass(funcptr functionpointer);
MyClass();
void callFunction(int myVar);
};
--MyClass.cpp--
MyClass::MyClass(){
myfuncptr = defaultFunc; //a value of type "int (MyClass::*)(int myVar)" cannot be assigned to an entity of type "MyClass::funcptr"
};
MyClass::MyClass(funcptr functionpointer){
myfuncptr = functionpointer;
};
void MyClass::callFunction(int myVar){
int i = (*myfuncptr)(myVar);
};
int MyClass::defaultFunc(int myVar){
return myVar + 3;
};
2 जवाब
मैंने कोशिश की कि फंक्शन पॉइंटर टाइपपीफ के हर संयोजन की तरह क्या महसूस हुआ और अंत में मुझे लगता है कि लैम्ब्डा काम करता है। मदद के लिए सभी का धन्यवाद।
--MyClass.h--
class MyClass{
private:
std::function<int(int)> func;
int defaultFunc(int myVar);
public:
MyClass(std::function<bool(int)> func);
MyClass();
void callFunction(int myVar);
};
--MyClass.cpp--
MyClass::MyClass(){
this->func = [=] (int a) {return defaultFunc(a);};
};
MyClass::MyClass(std::function<int(int)> func;){
this->func = func;
};
void MyClass::callFunction(int myVar){
int i = func(myVar);
};
int MyClass::defaultFunc(int myVar){
return myVar + 3;
};
इसे बदलें
typedef std::function<int(int)> funcptr;
(btw using
इन दिनों typedef
की तुलना में अधिक मुहावरेदार है) और
myfuncptr = [this](int x){ return defaultFunc(x); };
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।