Структурный интерфейс
Когда вы определяете новый struct
лучше также определить интерфейс для этого типа
(т.е. функции "setter" и "getter") или для прямого доступа к членам .
а также ->
операторы?
РЕДАКТИРОВАТЬ
Программирование на простом C
6 ответов
Это зависит от того, является ли ваша структура абстрактным типом данных или нет. Если вы сделаете определение структуры общедоступным в своем заголовке, то определение методов доступа не имеет никакого смысла - клиенты 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 вы обычно не определяете сеттеры и геттеры для каждого члена структуры.
Преимущества сеттеров и геттеров присутствуют в C++, потому что вы можете скрывать данные с помощью закрытых и защищенных данных. В C нет такой концепции частных и защищенных членов структуры.
Это зависит от размера программы и предполагаемого использования. Помните, что все члены структуры по умолчанию являются публичными. Если вы хотите, чтобы они были приватными, используйте вместо этого "класс".
В C, если вы создаете новую структуру, она уже имеет встроенный метод set / getter. Если вы используете имя переменной, вы используете varName.memberElement и если вы используете указатель структуры: pointer ->memberElement. Например:
struct Random
{
int temp;
};
Если мы создадим переменную структуры, struct Random example
тогда мы можем получить доступ и установить переменные, используя. нотации.
example.temp = 12345;
Если мы создадим указатель структуры, мы будем использовать -> нотацию.
struct Random element, *pointer;
pointer = &element;
Мы устанавливаем указатель, чтобы указать на элемент, а затем для доступа к членам,
pointer->temp = 12345;
Не нужно создавать отдельные интерфейсы и функции сеттера / геттера в C. Не заставляйте себя больше работать.
Если бы вы читали чужой код, вы бы предпочли:
setSomeValue(&aStruct, VALUE);
или же:
aStruct.someValue = VALUE;
Синтаксис второго делает очевидным, что поле aStruct устанавливается. Во-первых, вы зависите от имен функций и переменных, выбранных программистом для получения этой информации.
После ответа Брайана Бонди, в C вы не можете иметь добытчиков и сеттеров; функции-члены просто не являются частью языка.
В C++, как правило, они не используются, потому что структуры почти всегда содержат, как правило, Plain Old Data, и к элементам просто обращаются напрямую.