struct pointer函数指向其他struct的其他函数

时间:2016-10-21 09:06:26

标签: c++ struct c++14 function-pointers

我想知道是否可以将其他结构的功能指向结构:

示例:

typedef struct
{
    int func(int z)
    {
        return z * 2;
    }
} sta;

typedef struct
{
    int(*this.func)(int);
} stah;


int main()
{
    sta sa;
    stah sah;

    sah.func = &sa.func;

    return 0;
}

这可能是在结构中吗?

3 个答案:

答案 0 :(得分:1)

func的声明应如下所示:

int(sta::*func)(int);

或者,或者:

using my_type = int(sta::*)(int);
my_type func;

这更容易理解:my_type指向sta成员函数的指针的别名,该函数获得int并返回int
func只不过是具有my_type类型的数据成员。

为了将成员函数的实际指针指定给func,您可以改为:

sah.func = &sta::func;

然后您可以按照以下方式调用它:

(sa.*sah.func)(0);

答案 1 :(得分:1)

指向方法的指针的正确语法是:

&T::f

T是声明方法f的类型。请注意,要调用,指针必须绑定到T的实例,因为指针的值表示内存中实例开头的偏移量。

在C ++ 14中,您可以考虑std::function

#include <functional>

struct sta
{
    int func(int z)
    {
        return z * 2;
    }
};

struct stah
{
    std::function<int(int)> func;
};


int main()
{
    sta sa;
    stah sah;

    sah.func = std::bind(&sta::func, &sa, std::placeholders::_1);

    return 0;
}

您也可以使用lambdas而不是std::bind

int main()
{
    sta sa;
    stah sah;

    sah.func = [&sa](int z) { return sa.func(z); };

    return 0;
}

请参阅cppreference.com上的std::functionstd::bindstd::placeholders

答案 2 :(得分:0)

尝试并尝试后,解决方案是这样的:

示例:

typedef struct 
{
    int a;

    int SomeFunc(int a)
    {
        return a * 4;
    }

} somst;


typedef struct
{
    int a;
    int (*HGetValX)(int);
} hst;


int main()
{
    hst* a;
    hst decfunc; // New instance
    somst b;

    decfunc.HGetValX = (int(*)(int))0x421C10; // memory address, or &b.SomeFunc; | &b.SomeFunc; Produces warnings.
    b.a = 20;

    a = (hst*)&b;


    cout << decfunc.HGetValX(4) << b.SomeFunc(4) << a->a <<  endl;

    return 0;
}

查找内存地址

Ida decompilation 然后代码在没有警告的情况下编译,目标是用它们的函数挂钩结构。