【问题标题】: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__) */

【问题讨论】:

    标签: c++ list class pointers friend


    【解决方案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>;
        };
      }
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 2023-03-18
        • 1970-01-01
        • 2012-12-15
        • 2015-06-16
        • 2013-05-14
        • 1970-01-01
        相关资源
        最近更新 更多