Pav*_*aev 13
这取决于您的结构是否是抽象数据类型.如果你在头文件中公开结构定义,那么定义访问器没有任何意义--API客户端仍然可以直接读/写字段,而在C中,他们确实有合理的期望它可以工作.
另一方面,您可能希望完全隐藏结构,并仅向客户端显示其声明,作为一种不透明的句柄:
foo.h中:
typedef struct foo foo;
foo* foo_create();
void foo_free(foo*);
int foo_get_bar(foo*);
void foo_set_bar(foo*, int);
Run Code Online (Sandbox Code Playgroud)
Foo.cpp中:
struct foo {
int bar;
};
foo* foo_create() { return malloc(sizeof(foo)); }
void foo_free(foo* p) { free(p); }
int foo_get_bar(foo* p) { return p->bar; }
void foo_set_bar(foo* p, int newval) { p->bar = nwval; }
Run Code Online (Sandbox Code Playgroud)
client.cpp:
#include "foo.h"
foo* f = foo_create();
f->bar = 123; // compile error, bar is not defined
foo_set_bar(f, 123); // ok
Run Code Online (Sandbox Code Playgroud)
这样做的原因是1)封装,与OO相同,以及2)版本控制 - 您可以向结构中添加新字段,或者自由地重新组织它们,旧代码将保持二进制兼容.
| 归档时间: |
|
| 查看次数: |
3710 次 |
| 最近记录: |