结构体中有函数指针,如何让函数指针指向的函数能够获取这个结构体中的其它成员变量?
如题,一下是典型的示例代码:
- C/C++ code
typedef struct { int a, b; int *(max)(int,int);}Func;int max(int a, int b)/* * 如何让这个函数不需要参数也能获得结构体中的a和b这两个变量? **/{ return a>b ? a:b;}int main(){ Func f; f.max = max; f.a = 100; f.b = 50; printf("max: %d\n", f.max(f.a, f.b)); /* * 以上一段代码是这样的,我想让它这样也能输出同样的结果: * printf("max: %d\n", f.max()); * 不直接传参数给函数,能实现吗? **/ return 0;}请问,用C语言的话,能实现上述的功能吗?
[解决办法]
定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄存器去存你的变量值,max里再从指定寄存器里读出来?
总之都不是很灵活的做法,但函数指针么...
[解决办法]
哦对了,通过一些系统调用做起来还顺当一点,什么socket啦、管道啦、共享内存啦...
[解决办法]
你不传参数怎么得到具体地址呢
[解决办法]
像C++非static成员函数一样:
int max(_struct * pObj)
{
}
相当于显式传递this指针
[解决办法]
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
struct
{
static const int a=100, b=50;
int (*max1)();
}
Func;
int max()
/*
* 如何让这个函数不需要参数也能获得结构体中的a和b这两个变量?
**/
{
return Func.a>Func.b ? Func.a:Func.b;
}
int main()
{
Func.max1 = max;
//Func.a = 100;
//Func.b = 50;
printf("max: %d\n", Func.max1());
/*
* 以上一段代码是这样的,我想让它这样也能输出同样的结果:
* printf("max: %d\n", f.max());
* 不直接传参数给函数,能实现吗?
**/
getchar();
return 0;
}
[解决办法]
- C/C++ code
typedef struct _Func{ int a, b; int (*max)(struct _Func*);}Func, *PFunc;int max(PFunc f)/* * 如何让这个函数不需要参数也能获得结构体中的a和b这两个变量? **/{ return f->a > f->b ? f->a : f->b;}int main(){ Func f; f.max = max; f.a = 100; f.b = 50; printf("max: %d\n", f.max(&f)); /* * 以上一段代码是这样的,我想让它这样也能输出同样的结果: * printf("max: %d\n", f.max()); * 不直接传参数给函数,能实现吗? **/ return 0;}
[解决办法]
懂了,楼主是想用c去实现c++的类吧
[解决办法]
[解决办法]
如果你这里要达到c++那样的效果就应该是
struct Func
{
int a, b;
int (*max)(struct Fnc*this);
};
Func obj;
obj.max(&obj);
[解决办法]
[解决办法]
lz真是执着...
还是建议去挖点历史材料看看,Bjarne老哥以前在设计C++的时候应该已经有过许多尝试和思考,虽然我没看过,不过我觉得应该会留下一些文章,lz不妨找找看。
也可以试试从编译原理的角度找找突破口。
------解决方案--------------------
[解决办法]
[解决办法]
[解决办法]
[解决办法]
[解决办法]
寄存器里存结构体地址,或者在调用max函数前把结构体地址手工压栈
[解决办法]
我不知道你还有什么疑问
[解决办法]
我觉得还是老实点好,与其花这么多时间探讨这个问题,不如多写几行代码然后考虑关于其它的算法之类的问题!