使用函数指针显示函数的返回值

时间:2016-05-05 22:42:07

标签: c++ function-pointers virtual-functions

我需要使用函数指针来输出类中第一个虚函数的返回值。该函数位于一个虚拟表中,我试图返回此函数的值,但我一直得到地址返回给我而不是我想要的实际值。我知道我在正确的位置,因为当我在调试期间输出值时,我正在打印(output[0][0])();的值,它给了我正确的值。但是,当我在终端窗口中运行程序时,我无法让它给我相同的值。相反,我得到一个地址值。这是我目前的代码。

#include <cstdio>

class X
{
private:
    int v_one;
    int v_two;
    virtual int adder()
    {
        return v_one/v_two;
    }
public:
    X(){
        v_one = 15;
        v_two = 3;
    }
};

int getValue(void* x){
    int a;
    int *y = static_cast<int*>(x);
    int (***output)();
    output = (int (***)())(&y[0]);
    a = (output[0][0])();
    return a;
}

int main(){
    X x;
    printf("%d\n", getValue(&x));
    return 0;
}

1 个答案:

答案 0 :(得分:1)

获取函数地址的唯一方法是询问编译器 由于adder是私有的,因此无法从外部获取,但您可以使用另一个公共方法返回地址。

#include <cstdio>
#include <iostream>

class X;
typedef int (X::*MFP)();
class X
{
private:
    int v_one;
    int v_two;
    virtual int adder()
    {
        return v_one/v_two;
    }
public:
    X(){
        v_one = 15;
        v_two = 3;
    }
    static MFP getAddr()
    {
        return &X::adder;
    }
};

int main()
{
    MFP  action = X::getAddr();
    X   a;
    std::cout << (a.*action)() << "\n";
}

然后,您可以使用.*->*运算符调用成员函数(但这些运算符仍然需要有效的对象)。

你的get函数有很多错误。

int getValue(void* x){
    int a;
    // This cast is illegal.
    int *y = static_cast<int*>(x);

    // This is a function pointer.
    // A method pointer is a completely different animal.
    // The standard does not even guarantee a method pointer will fit
    // inside a function pointer value (if you are using virtual tables
    // it will absolutely not fit).
    int (***output)();

    // Yep this is meaningless.
    output = (int (***)())(&y[0]);

    // This is not how you call a method via a pointer.
    // Where do you think the `this` parameter is set up?
    a = (output[0][0])();

    return a;
}

功能与方法Ptr

int (X::*method)()  = nullptr;
int (*function)()   = nullptr;

std::cout << sizeof(method) << "   :   " << sizeof(function) << "\n";

Results in:
===========
16   :   8