在这种情况下,如何传递成员函数而不是函数? [复制]

Posted

技术标签:

【中文标题】在这种情况下,如何传递成员函数而不是函数? [复制]【英文标题】:How can I pass a member function instead of a function in this situation? [duplicate] 【发布时间】:2018-10-04 16:56:18 【问题描述】:

我在一个类中使用一个对象来实现它的功能。这个对象的类定义的头部包含一个 typedef,然后是类声明:

typedef void (*Foo)(int arg);
class Bar
private : double func(Foo f);

在我的班级中,我想创建一个成员函数将其传递给 func :

class myClass

private : 
    Bar bar;
    void my_func(int arg);
    void my_caller();
;

在 .cpp 中:

void myClass::my_caller()
    
        bar.func(&myClass::my_func);
    

返回错误“没有匹配的函数来调用 Bar::func...”。 我的理解是typedef中使用的类型不是“指向成员函数的指针”而是“指向函数的指针”。我想我必须改变这个 typedef 才能改变这个,但我不知道如何。

我是 C++ 的绝对初学者,所以我可能在这里偏离轨道。

编辑:

我了解我必须对 typedef 进行更改以改为创建指向成员函数的指针。问题是这个typedef在一个不同的头文件中,所以编译器返回“'myClass'还没有被声明”。

相反,我将研究仿函数和 std::function 库。

【问题讨论】:

我不确定你的问题到底是什么。 typedef 是指向函数的指针,而不是指向成员函数的指针,除此之外我不明白为什么要传递指向成员函数的指针,为什么不传递类的实例? 我已经编辑了标题以提及我正在尝试做的事情。 你标题的答案是:你不能。 但是typedef在Bar类头文件中,不知道怎么写才能考虑到成员函数的类。 【参考方案1】:

指向函数的指针和指向成员函数的指针是两个不同的东西。因为有问题的函数是myClass 的成员,所以正确的函数指针类型是:

typedef void (myClass::*Foo)(int arg);

【讨论】:

以上是关于在这种情况下,如何传递成员函数而不是函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

按名称传递参数

如何在不连接 Powershell 的情况下传递参数? [复制]

如何正确地将指针传递给第 3 方代码的成员函数? [复制]

如何在不更改原始数组的情况下更改函数中的数组? [复制]

第十七篇:复制控制( 上 ) --- 自定义复制函数

在这种情况下,“重新加载”会做啥? [复制]