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

发布于 2024-08-10 20:36:08 字数 504 浏览 3 评论 0原文

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

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 这样的函数,所以我找不到避免这种情况的方法。

感谢您的任何建议。 :)

How can I do this? (The following code does NOT work, but I hope it explains the idea.)

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

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

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

I want to call Caller in some way like:

Caller(ToBeCalled, "stuff")

and have Caller call ToBeCalled with whatever parameters it feels needs passing. If at all possible I want to keep everything encapsulated in the private part of my class. In reality, I'd have about 50 functions like ToBeCalled, so I can't see a way to avoid this.

Thanks for any suggestions. :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

输什么也不输骨气 2024-08-17 20:36:08

你大部分时间都到了那里。您缺少 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);

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

You're most of the way there. You're missing the return type from the typedef, it should be

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

Now, you just need to use it properly:

int Caller(FuncSig func, int a, char* some_string)
{
    return (this->*func)(a, some_string);
}

You want to pass around plain FuncSig instances, not FuncSig* -- a FuncSig* is a pointer to a pointer to a member function, with an extra unnecessary level of indirection. You then use the arrow-star operator (not its official name) to call it:

(object_to_be_called_on ->* func)(args);

For non-pointer objects (e.g. objects on the stack, or references to objects), you use the dot-star operator:

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

Also, be wary of operator precedence -- the arrow-star and dot-star operators have lower precedence than function calls, so you need to put in the extra parentheses as I have done above.

短叹 2024-08-17 20:36:08

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

I'm assuming you tried Caller(MyClass::ToBeCalled, "stuff") already, but is there any particular reason you need a function pointer? Also, please post the actual compiler error.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文