C++ c++;在类中注入函数
我有一个基本类:C++ c++;在类中注入函数,c++,class,lambda,private,C++,Class,Lambda,Private,我有一个基本类: 类任务{ 私人: bool启用; 无效(*foo)(); 公众: 虚拟void init(int period){enabled=true;} 虚空勾号()=0; 无效高(无效(*f)(){foo=f;} void callFoo(){foo();} bool isEnabled(){返回已启用;} }; 以及使用此方法实现任务的类: LedTask::LedTask(int-pin,Context*pContext){ 这个->引脚=引脚; 此->pContext=pCon
类任务{
私人:
bool启用;
无效(*foo)();
公众:
虚拟void init(int period){enabled=true;}
虚空勾号()=0;
无效高(无效(*f)(){foo=f;}
void callFoo(){foo();}
bool isEnabled(){返回已启用;}
};
以及使用此方法实现任务的类:
LedTask::LedTask(int-pin,Context*pContext){
这个->引脚=引脚;
此->pContext=pContext;
}
void LedTask::init(整数周期){
任务::init(期间);
此->发光二极管=新的发光二极管(引脚);
}
void LedTask::tick(){
任务::callFoo();
}
在main()
中:
Task*t3=新的发光二极管任务(发光二极管引脚,c);
t3->init(50);
t3->high([{Serial.println(“ok”);});
这是可行的,但我想知道如何访问t3
实例的私有(和公共)成员;比如:
t3->high([]{ led->switchOn(); });
简而言之,我想在一个类中注入一个函数,并在其中使用它的类成员。正如我在评论中提到的,我假设您的LedTask
类继承自Task
因此,您应该将函数指针放在任务
类中,使用纯虚拟
函数,该函数必须在继承类中实现:
class Task {
private:
bool enabled;
protected:
virtual void foo() = 0; // <<<<<<<<<<<<<<<<<<<<<<<<<<
public:
virtual void init(int period) { enabled = true; }
virtual void tick() = 0;
// void high(void (*f)()) { foo = f; } << not needed
void callFoo() { foo(); }
bool isEnabled() { return enabled; }
};
好的,从您的注释中可以看出,您需要Led
对象作为注入函数的参数
在init()
中创建的Led
的成员指针应传递给注入函数
你可以使用类似
std::function<void(Led&)> f_;
在实现中传递该参数,如上所述:
void foo() {
f_(*led);
}
在Task::high
中调用函数时,为什么不将成员值作为参数传递给该函数?听起来像是LedTask
继承自Task
,所以为什么不在Task
中使用纯virtual
函数,该函数在callFoo()
中调用?实际上不需要λ。@πάνταῥεῖ, 你好其思想是使用相同的LEDSTASK类实现,但每次需要时都要更改其行为。i、 e.我希望创建两个led任务(一个用于引脚13,一个用于引脚3),一个将自己的led切换到off,另一个将led切换到on(这只是一个示例:))。我认为为了实现这种行为,我可以将lambda注入函数体。@edoz90如果您确实需要lambda,这是有问题的,但是……我的环境(Arduino)没有std::function的函数头,我应该使用void(*f)()?我不懂LedTask构造函数的语法。编辑:无论如何,谢谢你的帮助。@edoz90可能会澄清一下所使用的语法。对于这种简单的情况,您可能实际上不需要使用std::function
,而是使用一个普通的函数指针。关键是,我不会在任务
基类级别这样做。我如何使用构造函数访问或调用LedTask自己的变量和方法?@edoz90我不明白你的问题?您的意思是要指定LedTask
的成员函数?您可以提供带有LedTask
的public
静态
成员函数,这些函数可以选择用于构造。但是,如果没有函数指针,还有很多其他方法可以解决这个问题。@edoz90“它可以工作,但不是我想要实现的”嗯,你不能从公共范围访问任何私有成员,句号。在你的问题中用一句话清楚地表达你想要达到的目标。
void(*f_)(Led&);
void foo() {
f_(*led);
}