struct pointer function points to other function of other struct

谁说胖子不能爱 提交于 2019-12-02 13:08:55

问题


I was wondering if is possible to point a function of other structure into of a structure:

Example:

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;
}

it's possible this in a struct?


回答1:


The declaration of func should look like this:

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

Or, alternatively:

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

This is easier to read: my_type is an alias for the type pointer to a member function of sta that gets an int and returns an int.
func is nothing more that a data member having type my_type.

In order to assign an actual pointer to member function to func, you can do this instead:

sah.func = &sta::func;

You can then invoke it as it follows:

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



回答2:


The correct syntax for a pointer to method is:

&T::f

Where T is a type declaring a method f. Note that to be called, the pointer must be bound to an instance of T, because the value of the pointer represents an offset to the beginning of an instance in memory.

In C++14, you may consider 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;
}

You can also use lambdas instead of std::bind:

int main()
{
    sta sa;
    stah sah;

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

    return 0;
}

See std::function, std::bind, and std::placeholders on cppreference.com.




回答3:


After trying and trying, the solution it was something like this:

Example:

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;
}

Finding memory address

then the code compiles without warnings, the objective is hook the structure with their functions.



来源:https://stackoverflow.com/questions/40172529/struct-pointer-function-points-to-other-function-of-other-struct

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!