Связанные списки в C: Насколько возможен дизайн ОО? - PullRequest
4 голосов
/ 26 октября 2011

Я работаю над реализацией динамического связанного списка в C, чтобы освежить свои навыки в C. Вот простая структура, которую я использую для представления LinkedList:

typedef struct List
{
   Node_t* head;
   Node_t* tail;
   uint32_t length;
   void (*add)(Node_t* head, void* data);
} List_t;

Я пишу все это в своем собственном C-файле с надеждой, что я смогу включить его в какой-нибудь другой C-файл и использовать реализацию связанного списка, которую я написал.

Вы заметите, что у меня есть указатель на функцию, которая добавит узел в связанный список. (У меня есть несколько функций, кроме add, но я просто хотел сначала выяснить это)

Если бы я использовал этот связанный список прямо сейчас, я бы назвал его таковым

List_t* list = GetList(); /* this is a constructor like method I wrote*/
list->add(list->head, someData);

Можно ли закодировать его в ОО-стиле, чтобы все, что мне нужно было бы сделать, это позвонить:

list->add(someData);

Не передавая в начале списка функцию add ()? Мои инстинкты говорят мне, что это невозможно, но мне действительно нравится идея заставить мои связанные списки работать таким образом.

-Akron

Редактировать: исправлена ​​ссылка для добавления, чтобы отразить тот факт, что список является указателем

Редактировать: Похоже, общее согласие нет. Спасибо за советы / ответы

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

То, что вы делаете - это дизайн ОО.

То, что вы просите, - это синтаксический сахар, чтобы ваш код на С был похож на код на каком-то другом языке.

Я бы посоветовал вам прекратить борьбу с языком, который вы используете, и вместо этого сосредоточиться на написании хорошего идиоматического кода.

Идиоматический способ C будет иметь такую ​​функцию, как

void List_Add(List_t *list, void *data);

И тогда ваш клиентский код будет просто называть его следующим образом:

List_Add(list, someData);
2 голосов
/ 26 октября 2011

РЕДАКТИРОВАТЬ : Нет, у меня на уме был C ++.

Лично, когда я использую связанные списки, я предпочитаю иметь функцию типа list_add(my_list, node), а не пытаться создавать свой кодсмотри все ОО.Вы можете сделать вещи абстрактными в некотором смысле в C, но если бы я хотел сделать мой код действительно OO, я бы просто использовал C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...