【发布时间】:2016-05-21 20:45:33
【问题描述】:
我有这个基类:
class Task {
private:
bool enabled;
void (*foo)();
public:
virtual void init(int period) { enabled = true; }
virtual void tick() = 0;
void high(void (*f)()) { foo = f; }
void callFoo() { foo(); }
bool isEnabled() { return enabled; }
};
还有一个用这个方法实现Task的类:
LedTask::LedTask(int pin, Context* pContext) {
this->pin = pin;
this->pContext = pContext;
}
void LedTask::init(int period) {
Task::init(period);
this->led = new Led(pin);
}
void LedTask::tick() {
Task::callFoo();
}
在main():
Task* t3 = new LedTask(LED_PIN, c);
t3->init(50);
t3->high([]{Serial.println("ok");});
这可行,但我想知道如何访问 t3 实例的私有(和公共)成员;类似:
t3->high([]{ led->switchOn(); });
简而言之,我想在一个类中注入一个函数,并在其中使用它的类成员。
【问题讨论】:
-
在
Task::high中调用函数时,为什么不将成员值作为参数传递给函数? -
听起来
LedTask继承自Task,那么为什么不在Task中简单地使用一个在callFoo()中调用的纯virtual函数呢?真的不需要 lambda。 -
@πάντα ῥεῖ,嗨;这个想法是拥有相同的 LedTask 类实现,但每次我需要时都改变他的行为。即我希望创建两个 LedTask(一个用于引脚 13,一个用于引脚 3)一个开关他自己的导致关闭另一个开关导致打开(这只是一个例子:))。我虽然为了实现这种行为,我可以用 lambda 注入函数体。
-
@edoz90 你是否真的需要一个 lambda 是值得怀疑的,但好吧......