结构接口
定义新struct
,最好还定义该类型的接口
(即“setter”和“getter”function)或直接通过访问成员.
和->
运营商?
编辑
普通C编程
这取决于您的结构是否是抽象数据类型。 如果你在头文件中公开结构定义,那么定义访问器没有任何意义–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);
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; }
client.cpp:
#include "foo.h" foo* f = foo_create(); f->bar = 123; // compile error, bar is not defined foo_set_bar(f, 123); // ok
这样做的原因是1)封装,与OO相同,以及2)版本控制 – 您可以向结构中添加新字段,或者自由地重新组织它们,旧代码将保持二进制兼容。
使用C,您通常不会为每个结构成员定义setter和getter。
C ++中存在setter和getter的优点,因为您可以通过private和protected进行数据隐藏。 使用C,没有私有和受保护的struct成员的概念。
如果您正在阅读其他人的代码,您是否愿意看到:
setSomeValue(&aStruct, VALUE);
要么:
aStruct.someValue = VALUE;
第二个语法很明显,正在设置aStruct的字段。 首先,您依赖于程序员选择的函数和变量名来获取该信息。
在C中,如果要创建新结构,则它已经内置了setter / getter。如果使用变量名,则使用varName.memberElement,如果使用结构指针:pointer – > memberElement。 例如:
struct Random { int temp; };
如果我们创建一个struct变量, struct Random example
那么我们可以使用它来访问和设置变量。 符号。
example.temp = 12345;
如果我们创建一个struct指针,我们将使用 – >表示法。
struct Random element, *pointer; pointer = &element;
我们将指针设置为指向元素,然后访问成员,
pointer->temp = 12345;
无需在C中创建单独的setter / getter接口和函数。不要为自己做更多工作。
这取决于程序的大小和预期用途。 请记住,默认情况下,结构的所有成员都是公共的。 如果您需要将它们设为私有,请改用“class”。
跟随Brian Bondy的回答,在C中你不能拥有吸气剂和制定者; 成员函数不是语言的一部分。
在C ++中,通常不使用它们,因为根据惯例,结构几乎总是包含普通旧数据,并且只是直接访问成员。