2010-10-28 2 views
3

Так что у меня возникли проблемы с выяснением того, как преодолеть это.Повторное использование такого же c ADT для других типов

Возьмет, к примеру, у меня есть красная черная реализация дерева, которое работает с предметами:

typedef unsigned long int Key; 
struct rbt_node{ 
    Item item; 
    int color; 
    Key key; 
    struct rbt_node* parent; 
    struct rbt_node* left; 
    struct rbt_node* right; 
}; 

затем в Item.hi определяет структуру Я буду использовать, например:

typedef struct _something* Item; 

Таким образом я развязываю Предмет, удерживаемый из реализации дерева. Проблема возникает, если я хочу повторно использовать ADT для других типов.

На данный момент мне нужно будет определить Item2.h и скопировать rbt.c/rbt.h в rbt2.c/rbt2.h и изменить их для использования Item2.h и сменить имена функций. Разве нет более чистого пути?

Я нашел это C double linked list with abstract data type, но он, похоже, имеет некоторые проблемы в зависимости от архитектуры и размера структур, которые я не очень хорошо осведомлен.

Я ищу такого использования:
rbt_insert(rbt_of_something, something);
rbt_insert(rbt_of_somethingElse, somethingElse);

Благодаря

+1

С некоторыми файлами заголовков и препроцессором вы можете имитировать шаблоны. – leppie

+1

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

+0

@Jens Gustedt Это выглядит интересным и отличным ресурсом, я должен посмотреть. Спасибо – GriffinHeart

ответ

2

Составить вопрос void*. Затем определите функции или макросы, которые вы используете для назначения/чтения элементов для выполнения требуемых действий. например

FILE* rbt_fileFromNode(struct rbt_node* node); 

Если вы хотите быть действительно умными и у вас есть определенное количество типов вы хотели бы поставить там, добавить перечисление в rbt_node или rbt_tree для хранения типа элемента.

+0

Я закончил для этого решения. Реализовано rbt с пустотами, а затем сделана .h с макросами для обработки отбросов для каждого типа. – GriffinHeart

3

Вы можете поместить все ваши определения элементов в одном единственном файле заголовка и использовать препроцессор правильно выбрать один:

#ifdef SOMETHING 
typedef struct _something* Item; 
#elif SOMETHINGELSE 
typedef struct _somethingElse* Item; 
#else 
#error no definition for Item. Use -D flag to specify Item definition. 
#endif 

Затем при компиляции просто используйте аргументы -D для определения одного из этих макросов.

+0

Возможно, вы захотите использовать макросы push/pop, чтобы вы могли использовать более одного типа при компиляции. – leppie

+0

Я не вижу, как это позволяет мне использовать ту же реализацию rbt для двух разных типов элементов в одном файле. Не могли бы вы уточнить? – GriffinHeart

+0

@GriffinHeart: используйте макросы push/pop или используйте '# undef' после включения заголовка, а затем определите следующий и так далее. – leppie

 Смежные вопросы

  • Нет связанных вопросов^_^