另一个类中使用的非静态类<未解析的重载函数类型>
Posted
技术标签:
【中文标题】另一个类中使用的非静态类<未解析的重载函数类型>【英文标题】:Non static class used in another class <unresolved overloaded function type> 【发布时间】:2014-08-26 09:28:22 【问题描述】:我正在努力在另一个类中使用一个类的非静态函数。我一直在阅读一些示例,但很难理解它的基础知识。到目前为止,我最好的尝试是使用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
超时函数,即.attachFunction中的参数,是ledStrips的成员。
这是 MPTimers 类中的代码
// AttachFunction
void MPTimers::attachFunction(void (*isr)() )
isrCallBack = isr;
错误是: 错误:没有匹配的函数调用'MPTimers::attachFunction(未解析的重载函数类型)。
我知道这是因为我的 MPTimers 实例不知道回调函数引用的是哪个实例,因为它是类的非静态成员。
我尝试了链接中描述的解决方案,但没有成功。希望你们中的一些人可以帮助我解决这个问题:)。
【问题讨论】:
timeout
是否有匹配的签名 (void timeout()
)?据我了解,您需要在 ledStrips
类中将此函数声明为 static void timeout();
成员。
是的,它被声明为具有相同签名的无效超时 :)
【参考方案1】:
如果你想在非静态成员函数上使用仿函数,语法应该是
void MPTimers::attachFunction(void (MPTimers::*isr)() )
isrCallBack = isr;
如果你想稍后调用它,语法将是
[....]
this->*isrCallback()
[....]
【讨论】:
只是为了弄清楚这一点。 IE。在我调用 Isrcallback() 的中断 ISR 例程中,应该将 grom isrCallBack() 更改为 this->*isrCallBack()。在我的其他课程中,我应该能够毫无问题地调用 attachFunction(timeout) 吗?或者有什么我应该注意的语法吗?并感谢您的回答:) 抱歉,我好像不太懂你的代码><.>void timeout() 是函数、方法还是静态方法?如果它是一个方法/函数。你在哪里定义的? 这是我的 ledStrips 类中的一个函数。这个想法是,每次我从 Timer 类中获得超时时,我都必须调用 ledStrips 中的超时函数,它会清除/设置一些寄存器。 所以,如果我是对的,您可以将 ledStrips 中的方法函数存储在 MPTimers 对象中......您稍后会在 LEDstrip 方法中使用它吗? 我认为这就是您想要的代码? ideone.com/mIAabj。我在其中完成的是附加回调方法,它位于 LDStrip 类中,然后稍后通过从 MPTimers 获取它来重新使用这个方法函数......可以吗?或者这不是你想要的?【参考方案2】:如果没有从该类实例化的对象,则不能调用该类的非静态方法。 MPTimers::attachFunction 需要一个静态方法或函数。如果你的 timeout 函数是一个普通的 C 函数,那么应该没有问题(所以显然不是这样),如果它是一个类的静态方法,那么你应该使用 ClassName::timeout,如果它是一个非静态方法一个类然后你不能做你想做的事,你需要修改你的 attachFunction 和你的 MPTimers 类来接受函子或对象/方法对(或使用静态超时方法)。
【讨论】:
我想最简单的解决方案是更改我的 MPTimers 类以接受函子。那么一个有效的解决方案是尝试 CollioTV 的答案? :) CollioTV 的解决方案只有在您使用 MPTimer 方法作为回调时才有效。如果您的回调是另一个类中的方法(例如 ClassA),那么您必须传递一个 ClassA 实例和一个 ClassA 方法,然后像这样调用回调:(obj->*method)()。你可以在这里看到不同的可能性:tutok.sk/fastgl/callback.html 谢谢哈维尔。肯定会调查的:)以上是关于另一个类中使用的非静态类<未解析的重载函数类型>的主要内容,如果未能解决你的问题,请参考以下文章
如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]