classMyClass { public: voidfunc1(); intfunc2(int a, int b); private: OtherClass* _otherclass; };
voidMyClass::func1(){ cout << "in func1" << endl; //wanna set func2 as a callback function into OtherClass }
intMyClass::func2(int a, int b){ cout << "in func2" << endl; return a + b; }
1 2 3 4 5 6 7
voidMyClass::func1(){ cout << "in func1" << endl; function<int(int, int)> cb = [](int a, int b) { return a + b; }; _otherclass->registerCallBack(cb); }
1 2 3
voidMyClass::func1(){ _otherclass->registerCallBack(func2); //error:invalid use of non-static member function }
1 2 3 4
voidMyClass::func1(){ auto cbf = std::bind(&MyClass::func2, this, std::placeholders::_1, std::placeholders::_2); _otherclass->registerCallBack(cbf); }
这里解释一下 bind 的作用:
这行代码是使用 C++ 中的 std::bind 函数创建了一个函数对象(function object),并将其分配给了名为 cbf 的变量。这个函数对象的作用是将 MyClass 类中的成员函数 func2 绑定到当前实例( this 指针),并且允许传递两个参数。
在 C++ 中,类的成员函数通常需要一个指向类实例的指针,通常称为 this 指针,以访问该实例的成员变量和其他成员函数。当您在成员函数内部使用 this 关键字时,它指向当前对象的地址。因此,绑定到当前实例意味着创建一个函数对象,该函数对象将包含指向当前对象的 this 指针,以便在后续调用该函数对象时,能够访问当前对象的成员函数和成员变量。
std::bind 函数的第一个参数 &MyClass::func2 是要绑定的成员函数的指针,而第二个参数 this 是指向当前对象的指针。这样,创建的函数对象 cbf 就可以在以后的调用中像普通函数一样使用,而它内部会使用正确的 this 指针来访问当前对象的成员函数 func2 和其他成员。
这种绑定技术非常有用,因为它允许您将成员函数作为回调传递给其他函数或对象,并且在后续调用时,不需要手动传递 this 指针。这可以简化代码并提高代码的可重用性。
1 2 3 4 5
intmain(){ MyClass mc; mc.func1(); return0; }
以下是 chatgpt 给出的示例:
成员函数指针和普通函数指针的差异在于成员函数需要额外的参数来指定类的实例,通常是指向类对象的指针,即 this 指针。
在 C++ 中,成员函数指针的类型由类的名称、成员函数名称和函数签名(参数类型和返回类型)决定。例如,对于类 MyClass 的成员函数 void func(int x, int y) ,其成员函数指针的类型为:
代码的大致逻辑为: 在主线程中创建某个类 A,调用该类的 start 函数,start 函数会用 pthread_create 创建一个子线程,子线程又会再创建一个子线程。然后主线程阻塞在 getchar 函数,等待按键按下,阻塞结束后调用类 A 的 stop 函数,在该函数中回收前面创建的两个子线程。而在子线程中,循环执行某些内容,直到类 A 的某个 flag 在 stop 中被置零,才跳出 while 循环。(所以我们通过 this 指针传递类 A 的某个 flag)