2009-11-10 56 views
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(ToBeCalled, "stuff") 

,并有Caller呼叫ToBeCalled与任何参数也感觉需要通过。如果可能,我想把所有的东西都封装在我班的私人部分。实际上,我有大约50个功能,如ToBeCalled,所以我看不到一种方法来避免这种情况。

感谢您的任何建议。 :)

+0

所有50个funcs中具有相同的参数列表为 “INT ToBeCalled(INT一个,字符* B);”,或可以是各种诸如 “INT的另一种(INT一个,字符* B,短C);”? – Test 2009-11-10 04:25:46

回答

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); 

此外,警惕运算符优先级 - 箭星和点星运算符比函数调用的优先级低,所以你需要把额外的括号,因为我在上面所做的。

+0

哦,我的上帝。我无法相信我那么接近。 我已经搞乱此代码为3小时,其实我试过你贴在一个点上的一切..但显然我错过了一个精确的组合,这是问题的答案。 非常感谢您的快速回答 - 这让我很遗憾,不能早点来这里! :) – Stigma 2009-11-10 04:40:57

0

我假设你试过Caller(MyClass::ToBeCalled, "stuff")了,但有没有你需要一个函数指针什么特别的原因?另外,请发布实际的编译器错误。

+0

感谢您的建议,是的,我试过。 :) 我实现财产的处理程序为Windows 7,但我说的库是(太)喜欢的功能。添加一些传统版本的文件,最后需要检查每个较旧的文件格式,如果较新的文件格式未实现。在这种情况下,“调用者”功能是测试各种版本格式,“ToBeCalled”是解释默认等的实际阅读器功能。至少所有格式共享相同的界面。 :) – Stigma 2009-11-10 04:58:18