我想知道是否可以将其他结构的功能指向结构:
示例:
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;
}
这可能是在结构中吗?
答案 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::function
,std::bind
和std::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;
}
查找内存地址