【发布时间】:2020-12-25 17:37:53
【问题描述】:
我试图解决我的问题好几天了,但我被卡住了,我希望你能帮助我。
我正在尝试在我的 C++ 项目中导入的库中使用 void start(CallbackFunction callback){} 方法。该方法需要我在自定义类MyClass 中创建的另一个方法,名为static void my_callback(const Param& param){}。我想在main() 中使用的方法是static void my_function()。
所以程序是main() -> my_function() -> start(my_callback());(如下main()所示)
我附加的代码运行良好。 问题是我必须将所有内容都声明为静态才能使其工作,我真的不希望这样。我希望有可能删除静态。
我也无法更改 LibClass、param 结构或 typedef 中的任何内容。
到目前为止,这是我的工作代码:
#include <functional>
struct Param {
float progress;
uint16_t index;
};
typedef void(*CallbackFunction)(const Param& param);
class LibClass {
public:
LibClass(){}
void start(CallbackFunction callback){}
};
class MyClass {
public:
//LibClass libClass;
static void my_function() { // <-- how do i do this without static
LibClass libClass; // <-- this should be a non-static class variable
libClass.start(my_callback); // <-- how to write this line then
}
static void my_callback(const Param& param) { // <-- how do i do this without static
}
};
int main (int argc, const char * argv[]) {
MyClass myClass;
myClass.my_function();
return 0;
}
【问题讨论】:
-
使用
std::function和myCallback的lambda 表达式,而不是使其成为static类成员函数。如果您愿意解释您这样做的真正用例,我们可以为您提供更好的帮助。通常如果你有成员函数(非static)你可以调用它们。如果你不想让它保持静态,你必须在那里传递this作为参数,任何类实例级别的成员都可以在那里访问。 -
您可以控制哪些部分,您不能控制哪些部分?你是定义
LibClass的那个人吗?CallbackFunction是否必须具有此特定签名?令人惊讶的是,一个明显的 C++ 库使用 C 风格的回调机制。 -
@IgorTandetnik 正如我在问题 CallbackFunction 中所说的那样,不幸的是,LibClass 和 Param 结构必须保持这种状态。其他一切都可以修改。真正的用例是借助仅提供此类/方法的上述库来控制 LED。
-
那你就卡住了,恐怕。您使用的库没有提供任何方法来将回调分派给非静态成员函数(例如,将
MyClass指针存储在全局变量中)。 -
@IgorTandetnik 如果我可以控制图书馆等等,你能告诉我一个例子,我必须改变什么才能使它在没有静态和我自己的类的情况下工作?这至少对我的理解有帮助。无论如何,感谢您的宝贵时间
标签: c++ function pointers methods