gpt4 book ai didi

c++ - 设置指向非静态成员函数的指针

转载 作者:IT老高 更新时间:2023-10-28 21:44:43 28 4
gpt4 key购买 nike

我正在尝试设置一个在执行期间根据一组用户参数设置的函数指针。我想让函数指针指向一个非静态成员函数,但我找不到怎么做。

我见过的例子说这只能使用静态成员函数或在直接 C 中使用全局变量。

一个简化的例子如下:

    class CA
{
public:
CA(void) {};
~CA(void) {};
void setA(double x) {a = x; };
void setB(double x) {b = x; };

double getA(const double x) {return x*a; };
double getB(const double x) {return x*b; };

void print(double f(const double), double x) {
char cTemp[256];
sprintf_s(cTemp, "Value = %f", f(x));
std::cout << cTemp;
};

private:
double a, b;
};

实现部分是

CA cA;
cA.setA(1.0);
cA.setB(2.0);

double (*p)(const double);

if(true) {
p = &cA.getA; //'&' : illegal operation on bound member function expression
} else {
p = cA.getB; //'CA::getB': function call missing argument list; use '&CA::getB' to create a pointer to member
//'=' : cannot convert from 'double (__thiscall CA::* )(const double)' to 'double (__cdecl *)(const double)'
}

cA.print(p, 3.0);

那么我如何让 p 指向 'getA' 或 'getB' 以便 'p​​rint' 仍然可以使用它。

据我所见,建议是使用 boost 或 std::bind ,但我对这两种方法都没有经验。我希望我不需要深入研究这些,我只是错过了一些东西。

编译器 MSVC++ 2008

最佳答案

不要忘记成员函数接受隐式 this 参数:因此,接受 double 的成员函数不能与非接受 double 的成员(免费)函数。

// OK for global functions
double (*p)(const double);

// OK for member functions
double (CA:*p)(const double);

调用它们的方式也不同。首先,对于成员函数,您需要一个对象来调用它们(其地址最终将绑定(bind)到函数调用中的 this 指针)。其次,您需要使用 .* 运算符(如果您通过指针执行调用,则需要使用 ->* 运算符):

p = &CA::getA;
CA cA;
(cA.*p)();

始终如一,您必须更改函数 print() 的定义:

    #include <iostream>

void print(double (CA::*f)(const double), double x)
{
// Rather use the C++ I/O Library if you can...
std::cout << "Value = " << (this->*f)(x);
};

所以最后,这就是你应该如何重写你的 main() 函数:

int main()
{
CA cA;
cA.setA(1.0);
cA.setB(2.0);

double (CA::*p)(const double);

if (true) // Maybe use some more exciting condition :-)
{
p = &CA::getA;
}
else {
p = &CA::getB;
}

cA.print(p, 3.0);
}

关于c++ - 设置指向非静态成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15035905/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com