请声明链接列表?

Posted

技术标签:

【中文标题】请声明链接列表?【英文标题】:Declaration of Linked List please? 【发布时间】:2015-12-22 22:19:49 【问题描述】:

我第一次尝试实现 LinkedList。我几乎完成了头文件的声明,但是我遇到了这个不会消失的小错误。在 Node 类下面声明类 LinkedList 和 Iterator 的地方,我不断收到一条消息“将 LinkedList 重新定义为另一种符号”和“将迭代器重新定义为另一种符号”。我尝试在代码的最顶部声明​​类,如下所示,将友元函数移动到私有声明,但似乎没有任何效果。有人可以指出我做错了什么。除了下面的内容,我没有做太多其他事情。

class LinkedList;
class Iterator;


template <typename T>
class Node
public:
    Node(T Data);


private:
    T data;
    Node* next;
    Node* previous;
    friend class LinkedList;  
    friend class Iterator;
;

template<typename T>
class LinkedList 
public:
    LinkedList();
    void pushback(T data); 
    //void insert(Iterator pos, T data);
    ~LinkedList();
    //Iterator begin();
    //Iterator end();

private:
    Node* first;
    Node* last;
    friend class Iterator;
;

template <typename T>
class Iterator
public:

private:
    Node* position;
    LinkedList* container;
    friend class LinkedList;
;

#endif /* defined(__Linked_List_1__LinkedList__) */

【问题讨论】:

【参考方案1】:

首先将LinkedList 声明为类,然后将LinkedList 定义为类模板。您应该立即将名称声明为类模板(其他声明也是如此):

template <typename> class LinkedList;

当引用相应的类模板时,例如,在Node 中的friend 声明中,您要么需要将类模板设为朋友,例如,使用

template <class S> friend class LinkedList;

...或者,可能,最好将相应的实例化为朋友:

friend class LinkedList<T>;

【讨论】:

谢谢。这解决了第一个问题,但我所有其他朋友的声明现在都在说“精心设计的类型指的是模板”。知道我应该怎么做吗?【参考方案2】:

您正将LinkedList 声明为非模板化。将其更新为:

template<typename T> class LinkedList;

Iterator 做同样的事情。

【讨论】:

【参考方案3】:

在实现LinkedList模板类时,由于Node是模板,需要将typename T转发到Node类的声明中,并且需要指定类型名来扩展特定类型的代码。

我的解决方案是使用嵌套类来解决一些复杂的依赖问题并为你做转发。(比如A类包含B类,B类包含A类)

namespace test
  template<typename T> class Iterator;

  template<typename T>
  class LinkedList 
  public:
    LinkedList();
    void pushback(T& data);
    void insert(Iterator<T> pos, T& data);
    ~LinkedList();
    Iterator<T> begin();
    Iterator<T> end();
  private:

    struct Node
      T data;
      Node* next;
      Node* prev;
    ; //Node should be expose to others, try not to complicate friendship

    Node* first;
  ;

  template<typename T> class Iterator
  public:
    T& operator*() const;
    T* operator->() const;
    Iterator<T> next();
  private:
    struct Node
      T data;
      Node* next;
      Node* prev;
    ;
    Node* position;
    LinkedList<T>* container;
    friend class LinkedList<T>;
  ;

上面的代码向您展示了如何使用嵌套类(或结构,基本上结构是一个类)。您不会将节点暴露给用户,并且迭代器应该是类指针。我更喜欢重载运算符 * 和 ->。

使用嵌套类是一件好事,因为很容易将一个类移出然后移入。当你认为可以使用嵌套类时,你应该尝试一下。

【讨论】:

以上是关于请声明链接列表?的主要内容,如果未能解决你的问题,请参考以下文章

节编号。请使用“开始”选项卡上的“多级列表”按钮,然后选择链接到标题样式的编号方案(无法添加题注)

为啥链接到 Promise.resolve() 的 .then() 允许重新分配 const 声明?

在线问题反馈模块实战(十三)​:实现多参数分页查询列表

原始链接列表在Java中反向链接列表时被修改

创建一个列表(url 链接)并将其部署为功能

软件下载链接获取方法