结构接口

定义新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 ++中,通常不使用它们,因为根据惯例,结构几乎总是包含普通旧数据,并且只是直接访问成员。