2

我正在尝试创建一个尽可能高效的速度距离和时间计算器,并希望使用根据输入而变化的指针来引用调用函数,但我不知道该怎么做。我尝试了很多不同的东西:

我最好的尝试:

// Inside class Math
double calcSpeed(double distance, double time); // These functions return a double value of the formula (non static)
double calcDistance(double speed, double time);
double calcTime(double speed, double distance);

// Inside Main
typedef double (Math::*FuncChosen)(double first, double second);
FuncChosen p = &Math::calcSpeed; // This changes according to input to different functions in Math class with same parameter types and return types
p(1, 2); // Not a function, how can I non explicitly call the function?

有没有办法在不使用指针或其他方式显式引用它的情况下调用此函数。就像从根据输入改变的指针调用函数一样?我真的不知道从哪里开始以及使用什么,因为我尝试的一切都是非法的。我基本上想在运行时选择函数而不使用多个 if,从而避免重复。(我找到了有类似问题的人,但还没有找到一种有效的方法来达到我的目的。)

提前致谢,

而且,是的,我是 C++ 新手,对指针/引用和内存没有做太多。

编辑:作为参考,更正后完成的完整代码- 可编译

4

2 回答 2

5

您没有包含MCVE,但注释和代码表明这些函数是 class 内的非静态成员函数Math。类型FuncChosen指向成员函数的指针。

指向成员的指针是奇怪的野兽。它不是真正的指针,因为它不直接指向任何东西。将指向成员的指针视为“类中的标识符”。因此,p标识一个特定的成员函数(例如calcSpeed)。正如您通常只能通过在对象上调用成员函数来调用它一样,您需要提供一个对象以通过指向成员的指针进行调用。因此,例如,如果您有以下代码:

Math m;
double res = m.calcSpeed(1.0, 2.0);

那么与指向成员的指针的等价物p将是:

Math m;
FuncChosen p = &Math::calcSpeed;
(m.*p)(1.0, 2.0);

运算符.*(和相应的->*)用于取消引用指向成员的指针。


为了完整性:以上适用于非静态成员函数。如果calcSpeedetc. 是静态成员函数,您将使用指向函数的普通指针来引用它们。

于 2014-10-28T09:26:10.210 回答
2

没有对象就不能调用非静态函数。回答这个问题:你可以这样打电话calcSpeed吗?

calcSpeed(10.4, 444.0);

不,因为它需要左侧的对象。

Math o;
o.calcSpeed(10.4, 444.0);

您可以保存此方法的地址,但您必须使用对象调用它:

(o.*p)(10.4, 444.0);

添加

如果对象由指针 ( Math* po = &o;) 引用,则->*需要使用运算符:

(po->*p)(10.4, 444.0);

这与以下内容相同:

((*po).*p)(10.4, 444.0);
于 2014-10-28T09:27:35.583 回答