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

标签 c++

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

我见过的例子说这只能使用静态成员函数或在直接 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/

相关文章:

c++ - C++类中的 vector 参数

C++ 依赖管理最佳实践

C++如何在.exe中编译dll

C++11 引入了标准化的内存模型。这是什么意思?它将如何影响 C++ 编程?

c++ - c和c++头文件的一些问题

android - 如何加快 android ndk 构建

c++ - 我应该在我的 C++ WIn32 应用程序中重写 operators new/delete

c++ - 使用 Stream Builder 查询字符串

C++ 字符串继承

c++ - OpenGL 问题 : cannot render geometry on screen