结构体中有函数指针,如何让函数指针指向的函数能够获取这个结构体中的其它成员变量?

灼眼的超哥 2012-03-07 03:55:52
如题,一下是典型的示例代码:

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语言的话,能实现上述的功能吗?
...全文
661 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
sx_wpc 2012-03-08
  • 打赏
  • 举报
回复
我觉得还是老实点好,与其花这么多时间探讨这个问题,不如多写几行代码然后考虑关于其它的算法之类的问题!
pengzhixi 2012-03-08
  • 打赏
  • 举报
回复
我不知道你还有什么疑问
灼眼的超哥 2012-03-08
  • 打赏
  • 举报
回复
难道只有结帖了???
oldm4n 2012-03-07
  • 打赏
  • 举报
回复
寄存器里存结构体地址,或者在调用max函数前把结构体地址手工压栈
[Quote=引用 1 楼 mooke 的回复:]

定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄存器去存你的变量值,max里再从指定寄存器里读出来?

总之都不是很灵活的做法,但函数指针么...
[/Quote]
__GUNS_N_ROSES__ 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 liuchao35758600 的回复:]

引用 17 楼 mooke 的回复:

引用 15 楼 gqjjqg 的回复:

引用 13 楼 liuchao35758600 的回复:

引用 12 楼 mooke 的回复:

引用 6 楼 liuchao35758600 的回复:

引用 1 楼 mooke 的回复:

定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄……
[/Quote]

C++对struct的处理方式和class接近,只是默认变量的访问权限都设置为public(class默认是private)。但二者的内存布局和解析的方式都是差不多的,一般视作公有权限的class就行,而且struct内部也支持设置权限修饰符。
灼眼的超哥 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 liuchao35758600 的回复:]

引用 17 楼 mooke 的回复:

引用 15 楼 gqjjqg 的回复:

引用 13 楼 liuchao35758600 的回复:

引用 12 楼 mooke 的回复:

引用 6 楼 liuchao35758600 的回复:

引用 1 楼 mooke 的回复:

定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄……
[/Quote]
输入法有点问题,打错字了,应该是:
C++里,在结构体中定义函数,这个函数就能访问结构体中的其它变量?
灼眼的超哥 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mooke 的回复:]

引用 15 楼 gqjjqg 的回复:

引用 13 楼 liuchao35758600 的回复:

引用 12 楼 mooke 的回复:

引用 6 楼 liuchao35758600 的回复:

引用 1 楼 mooke 的回复:

定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄存器去存你的变量值,max里再从指定寄存器里……
[/Quote]
C++里,在结构体中定义函数,这个函数就能访问这个就诶构体中的其它变量?
gqjjqg 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mooke 的回复:]

引用 15 楼 gqjjqg 的回复:

引用 13 楼 liuchao35758600 的回复:

引用 12 楼 mooke 的回复:

引用 6 楼 liuchao35758600 的回复:

引用 1 楼 mooke 的回复:

定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄存器去存你的变量值,max里再从指定寄存器里……
[/Quote]
16楼代码,谢谢。
__GUNS_N_ROSES__ 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gqjjqg 的回复:]

引用 13 楼 liuchao35758600 的回复:

引用 12 楼 mooke 的回复:

引用 6 楼 liuchao35758600 的回复:

引用 1 楼 mooke 的回复:

定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄存器去存你的变量值,max里再从指定寄存器里读出来?

总之都不是很灵活的做法,但函数……
[/Quote]

汗...折中也不能是你这样折的,这种写法C编译器肯定通不过,但如果你是用C++编译器的话,那问题就来了,C++编译器处理struct的方式跟C完全不一样,这时候实际上已经存在this指针了,那你又何必再弄两个参数进去,这不是无聊做法么?
gqjjqg 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gqjjqg 的回复:]

引用 13 楼 liuchao35758600 的回复:

引用 12 楼 mooke 的回复:

引用 6 楼 liuchao35758600 的回复:

引用 1 楼 mooke 的回复:

定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄存器去存你的变量值,max里再从指定寄存器里读出来?

总之都不是很灵活的做法,但函数……
[/Quote]


#include <stdio.h>
typedef struct Func_t
{
int a, b;
int max() {
return a>b ? a:b;
}
} Func;


int main()
{
Func f;
// f.max = max;
f.a = 99;
f.b = 50;

printf("max: %d\n", f.max());
/*
* 以上一段代码是这样的,我想让它这样也能输出同样的结果:
* printf("max: %d\n", f.max());
* 不直接传参数给函数,能实现吗?
**/
return 0;
}


贴错代码 - -
gqjjqg 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 liuchao35758600 的回复:]

引用 12 楼 mooke 的回复:

引用 6 楼 liuchao35758600 的回复:

引用 1 楼 mooke 的回复:

定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄存器去存你的变量值,max里再从指定寄存器里读出来?

总之都不是很灵活的做法,但函数指针么...

貌似我之前看过类似于这样的代码:
C/C+……
[/Quote]

折中吧, 用.cpp写C的代码。

#include <stdio.h>
typedef struct Func_t
{
int a, b;
int max(int a, int b) {
return a>b ? a:b;
}
} Func;


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

__GUNS_N_ROSES__ 2012-03-07
  • 打赏
  • 举报
回复
lz真是执着...
还是建议去挖点历史材料看看,Bjarne老哥以前在设计C++的时候应该已经有过许多尝试和思考,虽然我没看过,不过我觉得应该会留下一些文章,lz不妨找找看。

也可以试试从编译原理的角度找找突破口。
灼眼的超哥 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mooke 的回复:]

引用 6 楼 liuchao35758600 的回复:

引用 1 楼 mooke 的回复:

定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄存器去存你的变量值,max里再从指定寄存器里读出来?

总之都不是很灵活的做法,但函数指针么...

貌似我之前看过类似于这样的代码:
C/C++ code
window::resize……
[/Quote]
怎么能这样抛弃。。。
__GUNS_N_ROSES__ 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liuchao35758600 的回复:]

引用 1 楼 mooke 的回复:

定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄存器去存你的变量值,max里再从指定寄存器里读出来?

总之都不是很灵活的做法,但函数指针么...

貌似我之前看过类似于这样的代码:
C/C++ code
window::resize(100, 300);

它是怎么知道要修改的窗口尺寸是这个……
[/Quote]

程序运行肯定得有一个窗口实例产生,不管手段如何,要达到修改目的肯定得知道具体的修改位置,也就是内存地址的修改。所以你按这思路去想,只要能够找到对应的内存地址就行。C的封装能力极其有限的,所以才有了C++嘛,一个隐式this指针就能改变许多东西。

木有编译器支持就算能用非常规的做法实现那也属于不按语言规范使用语言的奇技淫巧一类,lz还是放弃吧...
pengzhixi 2012-03-07
  • 打赏
  • 举报
回复
如果你这里要达到c++那样的效果就应该是

struct Func
{
int a, b;
int (*max)(struct Fnc*this);
};

Func obj;
obj.max(&obj);


pengzhixi 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liuchao35758600 的回复:]
再加个要求:
结构体不能是全局变量,虽然可以将结构体当成参数传给函数,但是,我想知道是否有一种方法,能让函数即使不传参数,也知道该函数的函数指针所在的结构体。
[/Quote]
c++是因为有一个隐藏的参数this指针。
  • 打赏
  • 举报
回复
懂了,楼主是想用c去实现c++的类吧
灼眼的超哥 2012-03-07
  • 打赏
  • 举报
回复
再加个要求:
结构体不能是全局变量,虽然可以将结构体当成参数传给函数,但是,我想知道是否有一种方法,能让函数即使不传参数,也知道该函数的函数指针所在的结构体。
  • 打赏
  • 举报
回复

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;
}
灼眼的超哥 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mooke 的回复:]

定义Func的全局变量喽,这样你的自定义函数直接访问全局变量不就不需要额外传了。要么你强制一个寄存器去存你的变量值,max里再从指定寄存器里读出来?

总之都不是很灵活的做法,但函数指针么...
[/Quote]
貌似我之前看过类似于这样的代码:
window::resize(100, 300);

它是怎么知道要修改的窗口尺寸是这个window?
还有这个qt的:

#include <QApplication>
#include <QWidget>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
w.show();
return a.exec();
}

show()是怎么知道要显示的是w部件?
难道这是C++特有的,C无法模拟实现?
加载更多回复(5)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧