c ++在类中注入函数

时间:2016-05-21 20:45:34

标签: c++ class lambda private

我有这个基类:

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

简而言之,我想在一个类中注入一个函数并在其中使用它的类成员。

1 个答案:

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