作业帮 > 综合 > 作业

怎么把指向类成员函数的指针转化为指向int的一般指针

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/16 04:43:34
怎么把指向类成员函数的指针转化为指向int的一般指针
看这个例子class A {
public:
    void f() { }
};

typedef void (A::*AFuncPtr)();
typedef int *IntPtr;

int main() {
    AFuncPtr pa;
    IntPtr pi;
    pa = &A::f;
    pi = static_cast<int *>(reinterpret_cast<void *>(pa));
    return 0;
} ..然后我把代码改简单了一点:class A {
public:
    void f() { }
};
int main() {
    int *pi = static_cast<int *>(reinterpret_cast<void *>(&A::f));
    return 0;
}
再问: 我的错误是这样的:error C2440: “reinterpret_cast”: 无法从“int (__thiscall ListSeq::* )(DataType,DataType)”转换为“int *”1>          没有使该转换得以执行的上下文在一个类里面,想要实现一个类中定义的函数f1()作为参数,传给另一个函数f2(),传的时候就有这样的错误,试过了几个其他方法,还是错。
再答: 仔细看,先转成void *。
再问:   error C2440: “reinterpret_cast”: 无法从“int (__thiscall ListSeq::* )(DataType,DataType)”转换为“void *”  error C2664: “ListSeq::LocateElem”: 不能将参数 3 从“int *”转换为“int (__cdecl *)(DataType,DataType)”
再答: 我用的MinGW 4.8可以啊。你那不行的话我再想个办法吧,用联合体中转,见demo,看在你那能不能跑起来。#include <iostream>
#include <cstring>
using namespace std;

class A {
public:
    void f() { cout << "A::f()" << endl; }
    void g() { cout << "A::g()" << endl; }
};

typedef void (A::*AFuncPtr)();
typedef int *IntPtr;

union UPtr {
    AFuncPtr pa;
    IntPtr pi;
};

void test(int *pi) {
    UPtr up;
    memset(&up, 0, sizeof(up));
    up.pi = pi; //设置联合体的值
    AFuncPtr pa = up.pa; //按函数指针取出值
    A a;
    (a.*pa)(); //调用成员函数
}

int main() {
    UPtr up1, up2; //利用联合体做中转
    up1.pa = &A::f; //设置联合体的值
    up2.pa = &A::g;

    int *p1, *p2;
    p1 = up1.pi; //取出转换成的int *
    p2 = up2.pi;

    test(p1); //测试转换后能不能利用这个int *调用成员函数
    test(p2);

    return 0;
}
再问:
再答: 你的需求我没太看懂。
为何不用给compare函数加上static,compare传入了两个对象a、b,然后比较a和b是吧,又没用到this的成员。
类的加了static的成员函数跟全局函数是一样用的,函数指针也能通用。