私有成员函数,它接受指向同一类中的私有成员的指针。

3

我该如何做到这一点?(以下代码并不起作用,但希望能解释思路。)

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

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

    int Caller(FuncSig *func, char* some_string);
}

我希望以某种方式调用"Caller",例如:
Caller(ToBeCalled, "stuff")

我希望Caller可以使用任何需要传递的参数来调用ToBeCalled。如果可能的话,我希望将所有内容都封装在类的私有部分中。实际上,我会有大约50个类似ToBeCalled的函数,所以我看不到避免这种情况的方法。

感谢任何建议。:)


所有50个函数的参数列表都与“int ToBeCalled(int a, char* b);”相同,或者可能是不同的,例如“int Another(int a, char *b, short c);”? - Test
2个回答

7
你已经完成了大部分工作。你遗漏了typedef的返回类型,应该是:
typedef int (MyClass::*FuncSig)(int, char*);

现在,您只需正确使用它:
int Caller(FuncSig func, int a, char* some_string)
{
    return (this->*func)(a, some_string);
}

你想传递普通的 FuncSig 实例而不是 FuncSig* -- 一个 FuncSig* 是一个指向成员函数指针的指针,它具有额外的不必要的间接层次。然后使用箭头星号运算符(非正式名称)调用它:
(object_to_be_called_on ->* func)(args);

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

MyClass x;
(x .* func)(args);

此外,要注意运算符优先级 -- 箭头星号和点星号运算符的优先级低于函数调用,因此您需要像我上面所做的那样加入额外的括号。

天啊,我简直不敢相信我离答案这么近了。我已经折腾了这段代码三个小时了,实际上我曾经尝试过你所发的每一种方法,但显然我错过了一个精确的组合,而那正是答案。非常感谢您的快速回复 - 这让我后悔没有早点来这里! :) - Stigma

0
我假设你已经尝试过Caller(MyClass::ToBeCalled, "stuff"),但是你需要函数指针有什么特殊的原因吗?另外,请发布实际的编译器错误。

谢谢你的建议,是的,我试过了。 :)我正在为Windows 7实现一个属性处理程序,但我要访问的库(太)喜欢函数。加上一些旧版本的文件,你最终需要检查每个旧文件格式是否没有实现新的文件格式。在这种情况下,“Caller”函数测试各种版本格式,“ToBeCalled”是实际的读取函数,解释默认值等。至少所有格式共享相同的接口。 :) - Stigma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接