我正在努力使用另一个类中的一个类的非静态函数。我一直在阅读一些例子,但很难理解它的基础知识。到目前为止,我最好的尝试是使用http://www.newty.de/fpt/callback.html#static
给出的示例我有两个类:ledStrips和MPTimers。 MPTimers是一个在Atmega上使用计时器的类。我想要的是能够在ledStrips中调用MPTimers的实例。在MPTimers类中,我可以附加一个回调函数,该函数将在每次定时器中断时运行。
以下是我的代码示例,仅显示相关内容。
MPTimers _timerOne;
// Constructor
ledStrips::ledStrips()
{
_timerOne.initialize(1000); // Set up timer with 1000 ms delay
_timerOne.attachFunction(timeout); // Attach a function to the timer
_timerOne.stop(); // Stop timer
}
timeout函数是.attachFunction中的参数,是ledStrips的成员。
这是MPTimers类中的代码
// AttachFunction
void MPTimers::attachFunction(void (*isr)() )
{
isrCallBack = isr;
}
错误是: 错误:没有匹配函数来调用' MPTimers :: attachFunction(未解析的重载函数类型)。
我知道这是因为我的MPTimers实例不知道回调函数引用的实例,因为它是该类的非静态成员。
我尝试了链接中描述的解决方案,但没有成功。希望你们中的一些人可以帮我解决这个问题:)。
答案 0 :(得分:2)
如果要在非静态成员函数上使用functer,则语法为
void MPTimers::attachFunction(void (MPTimers::*isr)() )
{
isrCallBack = isr;
}
如果你想稍后调用它,语法将是
{
[....]
this->*isrCallback()
[....]
}
答案 1 :(得分:0)
如果没有从该类实例化的对象,则无法调用类的非静态方法。 MPTimers :: attachFunction需要静态方法或函数。如果你的超时函数是一个正常的C函数,那么应该没有问题(所以显然不是这种情况),如果它是一个类的静态方法,那么你应该使用ClassName :: timeout,如果它是一个非静态的方法一个类然后你不能做你想要的,你需要修改你的attachFunction和你的MPTimers类来接受仿函数或对象/方法对(或使用静态超时方法)。