c - 克服C中缺乏多态性的问题

标签 c polymorphism

我正在开发一个项目,严格要求用 C 语言实现两组具有相同签名的函数,这些函数可以从一个 .c 测试文件中使用。一组用于数据结构,另一组用于不同且不兼容的数据结构。 由于在 C 中不存在多态性,因此不可能调用在两个不同头文件 (.h) 文件中具有相同签名的两个实现的函数,并且理所当然地认为该调用将引用实际函数的正确实现。能够管理正确的数据结构。 好吧,我知道这看起来不可能而且矛盾,但是……就是这样…… 我必须合并两个通用项目,可以是列表或动态数组 更新: 在 List.h 上(dynamicArray 在另一个 .h 中)

    typedef struct Node{
  void *data;
  struct Node *next, *prevNode;
} Node;

//typedef struct declaration List
typedef struct List {
  struct Node *top, *bot, *prev;
  int size;
} List;



//in the dynamicarray.h file:
typedef struct dynamicArray{
  void **array;
  size_t size;
  size_t capacity;
}dynArray;



//in the dynamicarray.h file:
void* merge(void *element1,void *element2, int parameters){
  void * returner;

  if (parameters==ARRAY) {
    returner= Array_Merge(element1,element2); // expected to receive two arrays
  }
  else {
    returner= List_Merge(element1,element2); // expected to reveice two lists
  }

  return returner;
}

您对完成此请求有什么建议吗? 谢谢。

最佳答案

您需要将指向函数的指针和一些处理函数以及参数一起传递给测试。在 'c' 中,void * 可以用来代替任何指针。像下面这样的东西可能适合你:

int mytest(void*(*function)(void *), int(*handler)(void *), void *arg) {
    if (handler(function(arg)))
       return OK;
    return FAIL;
}

因此,您只需要为数组和列表设置单独的处理函数,并将它们与其他参数一起传递给测试函数。

回答您的最新评论

我可以想象如下的一些方案。

List list1;
dyArray array1;

MergedList outList;
MergedArray outArray;
...

void *getNextArrayElement(dynArray *array){...}
void *getNextListElement(List *list){...}

int mergeAsList(void* el, void *list){   
   if (el == NULL)
      return 0;
   ListMember *mmb = malloc(sizeof(ListMember));
   mmb->el = el;
   mmb->next = ((MergeList*)list)->head;
   (MergeList*)mergeList->head = mmb;
    return 1;
}

int mergeAsArray(void *el, void *array) {
    if (el == NULL)
      return 0;
    if (((MergeArray *)array)->index) >= MAX)
       return 0;
    ((MergeArray *)array)[((MergeArray *)array)->index++] = el;
    return 1;
} 
int mergeAsSortedArray(void *el, void *array){...}
...

test(getNextArrayEelement, mergeAsList, &arraty1, &outList);
test(getNextListEelement, mergeAsList, &list1, &outArray);
...

int test (void *(get*)(void*), 
          int (merge*)(void *m1, void *result), 
          void *in, 
          void *out) {
   void *el = get(in);
   int res = merge(el, out);
   return res;
}

关于c - 克服C中缺乏多态性的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60047121/

相关文章:

c - C 中挑剔的 bool 值

C 代码从文本文件中查找最大和最小数字

c - Lib(s)uinput : creating joystick with more than one button

php - 使用静态工厂模式时包含 PHP 库的最佳方法是什么?

C++ 防止继承基类的特定公共(public)成员

php - Laravel 5.1 - 多列的多态关系

无法设置esp8266 arduino的Station only模式

c - 进程间共享数据队列

polymorphism - 在 UML 类图中描述静态多态性

c++ - C++ STL 容器中的多态性