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);
    }