【问题标题】:Private member function that takes a pointer to a private member in the same class私有成员函数,它接受指向同一类中私有成员的指针
【发布时间】:2010-12-14 21:41:16
【问题描述】:

我该怎么做? (下面的代码不起作用,但我希望它能解释这个想法。)

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

标签: c++ function pointers function-pointers member


【解决方案1】:

您已经完成了大部分任务。您缺少 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);

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

【讨论】:

  • 天哪。我不敢相信我离得那么近。我已经把这段代码弄乱了 3 个小时,实际上我曾经尝试过你发布的所有内容。但显然我错过了一个精确的组合,那就是答案。非常感谢您的快速回答——这让我后悔没有早点来这里! :)
【解决方案2】:

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

【讨论】:

  • 感谢您的建议,是的,我试过了。 :) 我正在为 Windows 7 实现一个属性处理程序,但我正在与之交谈的库(太)喜欢函数。添加一些遗留版本的文件,如果没有实现较新的文件格式,您最终需要检查每个较旧的文件格式。在这种情况下,Caller 函数是测试各种版本格式,ToBeCalled 是解释默认值等的实际读取器函数。至少所有格式共享相同的界面。 :)
猜你喜欢
  • 2012-05-11
  • 1970-01-01
  • 2018-10-29
  • 2020-11-08
  • 2011-10-20
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多