私有成员函数,它将指针指向同一个类中的私有成员

Sti*_*gma 3 c++ pointers function-pointers function member

我怎样才能做到这一点?(以下代码不起作用,但我希望它能解释这个想法.)

class MyClass  
{  
    ....  
 private:
    int ToBeCalled(int a, char* b);

    typedef (MyClass::*FuncSig)(int a, char* b);

    int Caller(FuncSig *func, char* some_string);
}
Run Code Online (Sandbox Code Playgroud)

我想以某种方式给Caller打电话:

Caller(ToBeCalled, "stuff")
Run Code Online (Sandbox Code Playgroud)

并且可以Caller调用ToBeCalled任何感觉需要通过的参数.如果可能的话,我想把所有内容都封装在我班级的私有部分中.实际上,我有大约50个功能ToBeCalled,所以我看不到避免这种情况的方法.

谢谢你的任何建议.:)

Ada*_*eld 7

你大部分都在那里.你错过了typedef的返回类型,它应该是

typedef int (MyClass::*FuncSig)(int, char*);
Run Code Online (Sandbox Code Playgroud)

现在,您只需要正确使用它:

int Caller(FuncSig func, int a, char* some_string)
{
    return (this->*func)(a, some_string);
}
Run Code Online (Sandbox Code Playgroud)

您希望传递普通FuncSig实例,而不是FuncSig*- a FuncSig*是指向成员函数的指针,具有额外不必要的间接级别.然后使用箭头星运算符(而不是其正式名称)来调用它:

(object_to_be_called_on ->* func)(args);
Run Code Online (Sandbox Code Playgroud)

对于非指针对象(例如堆栈中的对象或对象的引用),使用点星运算符:

MyClass x;
(x .* func)(args);
Run Code Online (Sandbox Code Playgroud)

另外,要警惕运算符优先级 - 箭头星和点星运算符的优先级低于函数调用,因此您需要像上面所做的那样添加额外的括号.