另一个类中使用的非静态类<未解析的重载函数类型>

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 谢谢哈维尔。肯定会调查的:)

以上是关于另一个类中使用的非静态类<未解析的重载函数类型>的主要内容,如果未能解决你的问题,请参考以下文章

C ++:类之间的“未解决的重载函数类型”

如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]

2017-04-16抽象类接口构造函数重载静态成员和方法

2017-4-16 多态 构造函数 方法重载 静态方法和静态成员

C++类和对象下

类中的函数重载