gpt4 book ai didi

c++ - 为什么我不能引用指向实例化对象函数的指针?

转载 作者:行者123 更新时间:2023-12-01 14:36:43 25 4
gpt4 key购买 nike

编辑:std::function + lambda 来拯救。查看已检查的答案。

编辑:我添加了更多细节,我想要一个通用的解决方案,而不是绑定(bind)到类 B 的定义。

在下面的示例中,我尝试将一个类中的函数指针设置为另一个类实例中的函数(具有相同的函数指针类型),Microsoft C++ 告诉我:

C++ a pointer to a bound function may only be used to call the function

是否因为包含回调的对象可能在第一个对象之前被破坏?我正在将一些 Python 翻译成 C++,这种模式在 Python 中似乎不是问题。

我发现解决方法是使函数 static(和成员数据),但我只是在修改,直到编译器关闭并且代码正常工作,这不是我最喜欢的编程模式。

如果不允许这种模式,关于如何在没有静态对象/函数的情况下动态地执行此操作有什么建议吗?

#include <iostream>
#include <string>

typedef void (*callback_function_a)(int);

struct A
{
A() {
cbk = nullptr;
};
void print_int(void)
{
if (cbk != nullptr) {
cbk(10);
}
}
void set_callback(callback_function_a _cbk)
{
cbk = _cbk;
};
callback_function_a cbk;
};

struct B
{
B(std::string _header)
{
header = _header;
}
void print(int x) {
std::cout << header << x << std::endl;
}
std::string header;
};

void print(int x)
{
std::cout << "Non-member func: " << x << std::endl;
}

int main()
{
A classA;
B classB(std::string("MessageFrom classB:"));
/// How do I make both of these work? I want to be able to pass in any
/// function of type callback_function_a?
classA.set_callback(print); // OK
classA.set_callback(classB.print); // <--- error here
}

最佳答案

您的代码有几个问题。

首先成员函数指针和自由函数指针类型不同。对于成员函数指针,你应该有

typedef void (B::*callback_function_a)(int);
// ^^^^
// or
// using callback_function_a = void (B::*)(int);

其次,传递成员函数的语法应该是&ClassName::MemberFunction,也就是说,你必须

classA.set_callback(&B::print); 

最后但同样重要的是,您需要有一个类的实例来调用它的成员函数。因此在这里,

void print_int(void) {
if (cbk != nullptr) {
// cbk(10); // will not work
}
}

简单地调用成员函数指针是行不通的。您应该有一个 B 类的实例来调用它的成员。你需要,像

#include <functional>  // std::invoke (required C++17)

void print_int()
{
if (cbk != nullptr)
{
(/*instance of B class*/.*cbk)(10);
// or simply using `std::invoke`
// std::invoke(cbk, /*instance of B*/, 10);
}
}

关于c++ - 为什么我不能引用指向实例化对象函数的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62375446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com