在C ++中,为什么我不能引用指向实例化对象函数的指针?

问题描述 投票:0回答:3

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

在下面的示例中,我尝试将一个类中的函数指针设置为来自另一个类的实例的函数(具有相同的函数指针类型),并且Microsoft C ++告诉我:C++ a pointer to a bound function may only be used to call the function

是因为包含回调的对象可能在第一个对象之前被破坏了?我正在将一些Python转换为C ++,这种模式在Python中似乎不是问题。我发现解决方法是使函数(和成员数据)静态化,但是我只是在研究,直到编译器关闭并且代码可以正常工作,而不是我最喜欢的编程方式。

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

#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
}
    

编辑:我添加了更多细节,我想要一个通用的解决方案,而不是绑定到B类定义的解决方案。在下面的示例中,我尝试在一个类中将一个函数指针设置为一个函数(具有相同的函数...

c++ function-pointers member-function-pointers
3个回答
2
投票

您的代码有几个问题。


0
投票

除了Jejo的出色答案外,还可以添加一件事,即,可以使成员函数static并直接将其作为callback_function_a传递。示例:


0
投票

这是std::function的好用例之一。这是带有给定签名的类型擦除的可调用。

© www.soinside.com 2019 - 2024. All rights reserved.