我知道我可以在C中使用函数指针来模拟这样的方法:
typedef struct a
{
int x, y;
int (*add)(int x, int y);
}a;
int add(int x, int y)
{
return x + y;
}
int main()
{
a b = {2, 3, &add};
printf("%d\n", b.add(b.x, b.y));
return 0;
}
然而,在C中这种不好的形式?我应该找到其他方法吗?如果这很糟糕,我应该做什么而不是这个?显然,当我使用它时,它不会像在这个例子中那样简单。
答案 0 :(得分:2)
不错C; Linux充满了这样的代码
目前还不清楚这种风格是否能为你带来任何价值,从而留下个人品味,审美等方面的答案。
但有一件事我想提一下:如果你真的想模拟方法,你必须从模仿'this'指针开始。这就是方法(或一般的封装)的全部内容 - 它们可以访问结构的内部。
因此,您的代码应如下:
typedef struct a
{
int x, y;
int (*add)(struct a* this, int x, int y);
} a;
和
printf("%d\n", b.add(&b, b.x, b.y));
答案 1 :(得分:-1)
这在我的gcc 4.4.7中运行良好,在linux内核源代码中,有很多情况用这种方式编写。像file_operations,inode_operations等。它与策略模式和一些面向对象的编程思想相结合。 所以,我认为它在C中并不坏,我认为唯一的缺点是你可以这样写:
a b = {.x=2, .y=3, .add=add};
这更具可读性和风格。