【发布时间】:2013-06-22 07:54:10
【问题描述】:
我想让一个类'(为方便起见,我们称它为 X)方法能够使用指向其自己方法的指针,以防我能够提取仅因调用的方法而异的代码。
例如,有几个块:
a();
b();
c();
MehtodCall(someResultOfabc);
d();
e();
我想提取一个只使用作为指针传递的不同方法的方法:
所以我想要类似的东西:
void X::ExtractedMethod( void(X::*MethodCallPointer)(TypeOfABCResult) ){
a();
b();
c();
this->*MethodCallPointer(someResultOfabc);
d();
e();
}
并以这种方式使用这个功能:
void X::DoSomethingA(){
ExtractedMethod(&X::ADoer);
}
void X::DoSomethingB(){
ExtractedMethod(&X::BDoer);
}
和操作系统...
不幸的是,我被困在这里,因为我收到一个编译错误,即方法指针没有计算为采用一个参数的方法调用。
如果原因是 X 在此声明中仍然是一个不完整的类型,我开始徘徊?
如果有人能帮助我告诉我该怎么做,或者为什么不可能这样做,我会很高兴。
我真正非常不想要的是获得一些解决方法,例如在签名和 lambda 中使用 std::function,或者使用指向采用 X* 并调用我需要的特定方法的静态方法的指针, 也没有制作 switch 语句和标志, 也没有代替 switch 语句使用接口, 实现策略模式并使用策略的静态实例作为参数;) 这些并不是这种情况下的所有解决方法, 但我仍然没有想了解其他解决方法。我唯一感兴趣的就是以这种方式“有可能,以及如何做到”。
【问题讨论】:
-
X::ADoer和X::BDoer的签名是什么? -
不叫“方法”,在C++里叫“成员函数”。
-
@Griwes method 是一个通用的、与语言无关的 OOP 概念。该概念清楚地映射到 C++ 的成员函数,因此即使在 C++ 中也可以完美地使用该术语。 ;)
-
@syam,这不是一个正确的 C++ 术语,讨论是关于 C++。 C++ 是标准化的,一个标准术语是成员函数,所以使用它。当讨论是通用的时,可能会使用通用术语,但当讨论是特定的时,您应该始终使用特定的术语。而且,由于它在 C++ 的上下文中没有很好地定义,因此变得模棱两可。
-
@Griwes:下次请不要再说什么。我使用了一个通用词,所以我的意思毫无疑问。争论将它们命名为“方法”或“成员函数”在本主题中没有任何意义。如果你想就那个话题争论,那么请创建你自己的“问题”,这样你就可以在那里争论不存在的问题,而不是在这里发垃圾邮件。提前谢谢你。
标签: c++ class pointers methods