Структурный интерфейс

Когда вы определяете новый 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, и к элементам просто обращаются напрямую.

Другие вопросы по тегам