C++ 将类成员函数传递给其他类
C++ Pass class member function to other class
我有一个类wrapper
,它包含类trigger
的意图。我想将wrapper
的成员函数传递给trigger
,以便在某些事件上trigger
可以调用此类函数,从而对wrapper
实例产生影响。可以做到吗?
我对代码的想法是这样的:
class trigger {
public:
trigger(int trigger_thr): _trigger_thr(trigger_thr){};
trigger &operator+=(int v) {
_trigger_value += v;
check_trigger();
return *this;
}
void set_callback(someType f){
_f = f;
}
private:
int _trigger_value;
int _trigger_thr;
someType _f;
void check_trigger() {
if (_trigger_value >= _trigger_thr)
_f();
}
};
class wrapper {
public:
wrapper() {
_t.set_callback(someType some_function)
}
private:
void some_function() {/* do something */}
private:
trigger _t;
}
引用成员函数的语法是&wrapper::some_function
。这将创建一个指向成员函数的指针,该指针可以传递给另一个函数并进行存储。它的类型将是void (wrapper::*)()
的,要调用该函数,您必须有一个类型为wrapper
的对象(您不能只在 THIN AIR 上调用成员函数,您需要一个对象(。因此,要将其传递给触发器类,您还需要传递一个可以调用函数的wrapper*
。给定一个类型为wrapper*
的指针p
和一个指向类型void (wrapper::*)()
的成员m
的指针,您可以将其称为(p->*m)()
这是最丑陋和最难记住的C++语法形式之一。
或者,您可以使用 lambda 表达式创建一个闭包对象,该对象捕获对象并调用成员函数:
set_callback( [this] { this->some_function(); } );
要将闭包对象存储在成员变量中,您需要使用一个可以存储任何无需参数即可调用的可调用对象的std::function<void()>
。
因此,将函数参数和成员从someType
更改为std::function<void()>
,然后在调用set_callback
时使用 lambda 表达式。然后,您可以像在当前代码中一样_f()
调用它。
将 someType 替换为std::function<void()>
,并在wrapper
的构造函数中,给触发器一个调用适当方法的 lambda:
// in class trigger
void set_callback(std::function<void()> f) {
_f = f;
}
// in class wrapper
wrapper() {
_t.set_callback([this](){ some_function(); });
}
相关文章:
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 为什么 ADL 的运算符函数行为与其他函数不同?
- 将其他函数中的变量用于主函数C++
- 使用函数打开文件,然后让其他函数利用该文件?
- 如何创建一个函数来执行其中的其他函数
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- 变量 z 无法从其他函数访问变量 x
- 将 libstdc++ 和其他函数组合到一个库中
- 休眠函数,但不阻止其他函数和代码
- 我的代码只会运行主函数,其他函数不会在C++中编译
- 传递多个参数的功能,该函数将类包含到其他函数
- 仅一个功能的链接错误.在同一类和CPP文件中具有相似签名的其他函数工作正常
- 如果从在其他函数中调用的函数引发异常会发生什么情况
- 为什么在其他函数中声明的函数不参与参数相关查找?
- C++ - 有没有办法只继承一次某些函数,而其他函数在多次继承中多次继承?
- 我应该删除来自其他函数或类方法的指针吗?
- Windows表单如何使用其他函数回调图表信息
- 关于函数调用,我的程序没有读取我的其他函数。为什么?