方法从C 中的另一个对象执行
Method execution from another object in C++
首先,我可以引入一点点的班级结构。我正在为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::ref
的std::function
使用。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 在C++中,系统如何将这些对象中的每一个与执行程序的窗口相关联?
- 方法从C 中的另一个对象执行
- 一次对所有对象执行一个函数(没有for循环)