我有这个基类:
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(); });
简而言之,我想在一个类中注入一个函数并在其中使用它的类成员。
答案 0 :(得分:0)
正如我在评论中所提到的,我认为您的LedTask
类继承自Task
。
所以你应该把函数指针放在Task
类中,而不是纯virtual
函数,它必须在继承类中实现:
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; }
};
然后在基于LedTask
构造函数参数的foo
实现std::function
的第二步中执行:
class LedTask : public Task {
public:
LedTask(uint8_t pin, Context* pContext , std::function<void()> f)
: pin_(pin), pContext_(pContext), f_(f) {
}
private:
void foo() {
f_();
}
uint8_t pin_;
Context* pContext_;
std::function<void()> f_;
};
嗯,从您的评论中可以看出,您需要Led
对象作为注入函数的参数。
Led
中创建的init()
成员指针应该传递给注入的函数。
您可以使用类似
的内容 std::function<void(Led&)> f_;
或
void(*f_)(Led&);
传递该参数在实现中完成,如上所述:
void foo() {
f_(*led);
}