C ++函数指针(类成员)为非静态成员函数
class Foo { public: Foo() { do_something = &Foo::func_x; } int (Foo::*do_something)(int); // function pointer to class member function void setFunc(bool e) { do_something = e ? &Foo::func_x : &Foo::func_y; } private: int func_x(int m) { return m *= 5; } int func_y(int n) { return n *= 6; } }; int main() { Foo f; f.setFunc(false); return (f.*do_something)(5); // <- Not ok. Compile error. }
我怎样才能使这个工作?
你想要的线是
return (f.*f.do_something)(5);
(编译 – 我试过了)
“ *f.do_something
”指的是指针本身—“f”告诉我们从哪里得到do_something的值。 但是当我们调用这个函数的时候,我们仍然需要给这个指针一个对象。 这就是为什么我们需要“ f.
”前缀。
class A{ public: typedef int (A::*method)(); method p; A(){ p = &A::foo; (this->*p)(); // <- trick 1, inner call } int foo(){ printf("foo\n"); return 0; } }; void main() { A a; (a.*ap)(); // <- trick 2, outer call }
class A { int var; int var2; public: void setVar(int v); int getVar(); void setVar2(int v); int getVar2(); typedef int (A::*_fVar)(); _fVar fvar; void setFvar(_fVar afvar) { fvar = afvar; } void insideCall() { (this->*fvar)(); } }; void A::setVar(int v) { var = v; } int A::getVar() { std::cout << "A::getVar() is called. var = " << var << std::endl; return var; } void A::setVar2(int v2) { var2 = v2; } int A::getVar2() { std::cout << "A::getVar2() is called. var2 = " << var2 << std::endl; return var2; } int main() { A a; a.setVar(3); a.setVar2(5); // a.fvar = &A::getVar; a.setFvar(&A::getVar); (a.*a.fvar)(); a.setFvar(&A::getVar2); (a.*a.fvar)(); a.setFvar(&A::getVar); a.insideCall(); a.setFvar(&A::getVar2); a.insideCall(); return 0; }
我延长了Nick Dandoulakis的回答。 谢谢。
我添加了一个从类外部设置成员函数指针的函数。 我添加了另一个可以从外部调用的函数来显示成员函数指针的内部调用。
试试(f。* do_something)(5);
#include<iostream> using namespace std; class A { public: void hello() { cout << "hello" << endl; }; int x = 0; }; void main(void) { //pointer A * a = new A; void(A::*pfun)() = &A::hello; int A::*v1 = &A::x; (a->*pfun)(); a->*v1 = 100; cout << a->*v1 << endl << endl; //----------------------------- A b; void(A::*fun)() = &A::hello; int A::*v2 = &A::x; (b.*fun)(); b.*v2 = 200; cout << b.*v2 << endl; }
我认为调用类的非静态成员也可以使用静态成员函数来完成。