【问题标题】:I need help thinking of a different approach of implementing a C++ style Linked List in C我需要帮助考虑在 C 中实现 C++ 样式链接列表的不同方法
【发布时间】:2012-10-29 01:43:34
【问题描述】:

这是我的 C 课作业;我已经有使用 C++ 的经验。我遇到的问题是,我的实现看起来就像地狱一样阴暗。我当前的实现只允许一次使用一个 LinkedList。我知道我总是可以只传递一个指向结构的指针,但我想避免这种情况。因此,它变得非常阴暗。我也没有办法规范函数的范围;它们在全球范围内可见。还要注意指向 h 文件中结构的指针;这就是为什么我不能有超过一个程序的原因。除了把每个函数的指针都传进去,还有人能想到别的办法吗?

目前只是单链接,但双链接不会超过 30 分钟。

LinkedList.h

LinkedList.c

【问题讨论】:

  • 您只需将指向链表的指针作为参数传递。这就是 C++ 中 this 指针的最终结果(它是隐式传递的)。
  • 什么是 C++ 风格的链表,而不是 C 风格的链表?
  • 你说我知道我总是可以只传递一个指向结构的指针,但我想避免这种情况。 你为什么要避免这种情况?这会导致您想避免哪些问题?
  • 在您的 .h 文件中,我看到了链接列表的结构,但我没有看到应该代表链接列表项的结构...似乎您错过了一大块拼图.
  • @qdii,我认为它不会使用像 STL 这样的 C++ 专有东西。

标签: c++ c list pointers linked-list


【解决方案1】:

是的,在 C 语言中,您会将指向结构的指针传递给对其进行操作的每个函数。

typedef struct list list_t;

list_t *list_new();
void list_delete(list_t *list);
void list_insert_back(list_t *list, void *obj);
void list_insert_front(list_t *list, void *obj);
/* etc. */

我不确定您所说的“调节范围”是什么意思。如果你在谈论函数名,那么你通常会在函数名前加上一个常见的前缀,比如上面的list_

在幕后,这最终与 C++ 代码相同。 C++ 编译器为成员函数添加前缀(如示例使用 list_,尽管 C++ 编译器的做法不同),并且 C++ 编译器也隐式传递 this 参数。

事实上,最古老的 C++ 编译器 (cfront) 可以将 C++ 代码直接翻译成上面的 C 代码。

请注意,与典型的 C++ 方法相比,您不必在头文件中定义链表结构——这允许您在不破坏 ABI 兼容性的情况下更改数据结构。

【讨论】:

    【解决方案2】:

    由于您的其余问题已得到解答,我想补充一点,您可以限制函数的范围:只需声明它们static,这将为它们提供内部链接:

    /* This function won't be seen outside of the header file */
    static void foo(list *l); 
    

    这基本上相当于在一个类中声明一个私有函数foo

    class list
    {
    private:
        void foo();    
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 2011-09-19
      相关资源
      最近更新 更多