C语言结构体支持函数指针吗?

kkman7304 2012-06-29 10:32:48

typedef struct ab
{
int (*func)(int a,int b);
}



这样子有问题吗?
...全文
457 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly621000 2014-04-25
  • 打赏
  • 举报
回复
引用 9 楼 fdl19881 的回复:
http://dongxicheng.org/cpp/ooc/ 这个方法就是封装, 不过在linux内核中一般不用隐藏私有数据。 结构体中的函数指针可以实现c++式的,将数据和函数封装在一起 struct student { const struct stu_op *op; char name[100]; int score; }; struct stu_op { void (*set_name)(struct student * ); void (*set_score)(struct student *); } //下面两个结构体已经在别处定义好了。比如这两种方法可以是不同的实现方法、 等。比如op1是输入的方式, op2是从文件读进入。 extern const struct stu_op op1; extern const struct stu_op op2; struct student st1; st1->op = op1; ... //调用 st1.op->set_name(&st1); st1.op->set_score(&st1); 像这样的。。 这个方法多看看开源的库(用c实现的)一般都会使用。
你好~~看了你写的东西很受教~~但是,有一个问题想请问下你~~就是 struct stu_op { void (*set_name)(struct student * ); void (*set_score)(struct student *); }这里的函数指针里的第一个参数是不是必须声明为指向自己结构的一个指针类型呢?如果,这样定义只是为了能够通过函数调用自身成员,那在建立构造函数时候,不是会返回一个指向该结构对象的一个指针嘛?那这里的参数还有什么用呢?
sky8023 2013-04-09
  • 打赏
  • 举报
回复
http://www.doc88.com/p-170109004123.html 这里面一个例子和问题一样,可以看看的哦
fdl19881 2012-06-29
  • 打赏
  • 举报
回复
你想看把数据隐藏的情况下的,就看我上面给的网址。

我指的只是把数据和方法封装在一起。内核中就是这样做的,还有我刚看过的libevent库也是这样做的。或许将其看作继承,? 也行吧。 要完全模拟C++也是可能,只是一个是语言级别支持,一个是使用技巧来模拟。
至于这种方法叫不叫封装,那就见仁见志了。

linux内核中, struct file; 这个结构体有个成员f_op(结构体里面是各种操作的指针) , 如果描述的是文件,则f_op指向一个文件操作的结构体变量(static const 变量) , 如果描述的socket,则指向一个socket操作的结构体变量 。 这就像继承一样, 接口一样,但实现不同。

个人理解。如果有误,请见谅。本人对内核也只是读了一小部分而已。
N0bug 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
http://dongxicheng.org/cpp/ooc/
这个方法就是封装,

不过在linux内核中一般不用隐藏私有数据。

结构体中的函数指针可以实现c++式的,将数据和函数封装在一起
struct student {
const struct stu_op *op;
char name[100];
int score;
};

struct stu_op {
……
[/Quote]
单靠结构体+函数指针不可能封装,C封装主要靠的是static
woshi19872008 2012-06-29
  • 打赏
  • 举报
回复
支持!
#include <iostream>
using namespace std;

int Add(int x, int y)
{
return x+y;
}

int Div(int x, int y)
{
return (x-y);
}

typedef struct A
{
int a,b;
A():a(0),b(0)
{
}
A(int x, int y):a(x),b(y)
{}
int (*func)(int x, int y);
}STR_A;

int main()
{
STR_A instance(5,3);
instance.func = Add;
cout<<instance.func(instance.a,instance.b)<<endl;
instance.func = Div;
cout<<instance.func(instance.a, instance.b)<<endl;
return 1;
}
fdl19881 2012-06-29
  • 打赏
  • 举报
回复
http://dongxicheng.org/cpp/ooc/
这个方法就是封装,

不过在linux内核中一般不用隐藏私有数据。

结构体中的函数指针可以实现c++式的,将数据和函数封装在一起
struct student {
const struct stu_op *op;
char name[100];
int score;
};

struct stu_op {
void (*set_name)(struct student * );
void (*set_score)(struct student *);
}

//下面两个结构体已经在别处定义好了。比如这两种方法可以是不同的实现方法、
等。比如op1是输入的方式, op2是从文件读进入。
extern const struct stu_op op1;
extern const struct stu_op op2;

struct student st1;
st1->op = op1;

...
//调用
st1.op->set_name(&st1);
st1.op->set_score(&st1);

像这样的。。
这个方法多看看开源的库(用c实现的)一般都会使用。
N0bug 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
C的高级用法,,能模拟C++类的封装方式,和多态,继承特性。
[/Quote]
求别说 如何能封装
fdl19881 2012-06-29
  • 打赏
  • 举报
回复
C的高级用法,,能模拟C++类的封装方式,和多态,继承特性。
fdl19881 2012-06-29
  • 打赏
  • 举报
回复
linux内核 ,,libevent库中大量在结构体中使用函数指针
westlife_2011 2012-06-29
  • 打赏
  • 举报
回复
楼上废话好多
三个字,没问题!
孟小子 2012-06-29
  • 打赏
  • 举报
回复
.函数指针定义
函数类型 (*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int (*f)(int x);
double (*ptr)(double x);
在定义函数指针时请注意:
    
函数指针和它指向的函数的参数个数和类型都应该是—致的;
函数指针的类型和函数的返回值类型也必须是一致的。lz的定义也可以
孟小子 2012-06-29
  • 打赏
  • 举报
回复
在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。,,,可以吗??
ProgrammingRing 2012-06-29
  • 打赏
  • 举报
回复
还真没这样用过,学习了……
justkk 2012-06-29
  • 打赏
  • 举报
回复
没有问题,就是一个指针而已,不管指向什么

70,020

社区成员

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

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