方法从C 中的另一个对象执行

Method execution from another object in C++

本文关键字:一个对象 执行 方法      更新时间:2023-10-16

首先,我可以引入一点点的班级结构。我正在为ARM设备设计一个小库(STM32),我想实现一些定义系统上可用外围的对象。

class xGPIO : public Peripheral 
{
public:
    xGPIO();
    xGPIO(GPIO_TypeDef * GPIOx1, uint16_t Pinx1);
    virtual ~xGPIO();
    void on(void);
    void off(void);
private:
    void xInitGPIO(void);
};

我想到的想法是实现一个名为回调的内部公共函数,该函数设置了下一个函数在我的计时器对象上。但是,此功能肯定是另一类定义的方法,我希望它可以从Xtimer执行。这里的行为应该是,每当计时器结束其倒计时时,都应调用程序员在回调方法中存储的函数。

class xTimer : public Peripheral 
{
public:
    xTimer(TIM_TypeDef * tim);
    virtual ~xTimer();
    /* void callBack(void (*f)()); */
private:
    void xInitTimer(void);
    TIM_HandleTypeDef htim;
};
void xTimer::callBack(void (*f)())
{
   f();
}

main.cpp下的代码如下:

int main(void)
{
    mySYS->initialize(false);
    xGPIO myGreenLed (GPIOB, GPIO_PIN_0);
    /* Declare Timers.  */
    xTimer myTimer(TIM2);    
    // myTimer.callBack(myGreenLed.on);
}

有关如何解决此问题的任何线索?是否有一种简单的方法可以在C 程序上遵守该设计?

您正在使用C模式。C 具有更强大的std::function。您的xTimer::callBack应定义为

void xTimer::callBack(std::function<void(void)> f) { f(); }

因此可以称为

myTimer.callBack([&](){myGreenLed.on()}); //using lambda

myTimer.callBack(std::bind(&xGPIO::on, &myGreenLed));

直接使用模板时,也可以在没有std::function的情况下进行:

template<class T>
class xTimer : public Peripheral 
{
public:
    xTimer(TIM_TypeDef * tim);
    virtual ~xTimer();
    void callBack(T &obj, void (*T::f)())
    {
        (obj.*f)();
    }
private:
    void xInitTimer(void);
    TIM_HandleTypeDef htim;
};

可以像:

一样使用
xTimer<xGPIO> myTimer(TIM2);    
myTimer.callBack(myGreenLed, &xGPIO::on);

然后,您会失去std::function的灵活性,然后它与std::bind和Lambdas不起作用,但是获得了没有分配/DealLocation的优势。

模板也可以在callback级别上,但是我想您实际上要存储该值并稍后调用,然后您需要将存储存储。

如果您所调用的方法仅是特定单一类型的成员(即始终xGPIO),那么您甚至不需要模板。

还要注意,如果您存储以后要调用的对象实例,则必须确保对象寿命保留,直到需要调用(或者需要制作副本,使用std::shared_ptr等)。这也适用于使用和对象指针或std::refstd::function使用。

相关文章: