0

リストとノードの次の定義があるとします。


template <class T> 
class List {
    public:
        class Iterator;
        class ConstIterator;

        //Constructors and Destructors.
        List() : head(NULL), tail(NULL), size(0) {}
        List(const List& list);
        ~List();

        //Methods
        Iterator begin();
        ConstIterator begin() const;
        Iterator end();
        ConstIterator end() const;
        void insert(const T& data);
        void insert(const T& data, const Iterator& iterator);
        void remove(const Iterator& iterator);
        int getSize() const;
        Iterator find(const T& item);
        ConstIterator find(const T& item) const;
        void sort();

        //Operators
        List operator = (const List& list);


    private:
        class Node;
        Node* head;
        Node* tail;
        int size;
};


template <class T>
class List<T>::Node
{
    public:
        //Constructors and destructors
        Node(const T& _data, const Node* _next) : data(_data), next(_next) {}       
        ~Node(); //Destructor 

        //Methods


        //Operators
        Node operator = (const Node& node);

    private:
        T data;
        Node* next;
};

次のようなリストにデータを挿入する関数を作成しています。


    template<class T>
    void List<T>::insert(const T& data)
    {
    Node newNode = new Node(data, NULL);

    if (head == NULL)
    {
        head = &newNode;
        tail = &newNode;
    }
    else
    {
        (*tail)->next = &newNode;
        tail = &newNode;
    }
    size++;
}

しかし、私が奇妙だと思うのは、スワップ(*tail)->next = &newNode;(*tail).next = &newNode;てもコンパイルされることです。なぜ、そしてそれを行う正しい方法は何ですか?

4

4 に答える 4

0

Node->tail の使用は、(*Node).tail の省略形です。どちらの形式も有効です。Strangeus は、(*Node)->tail がコンパイルされるということです。これを行うには、Node を二重ポインターとして定義する必要があります。つまり、次のようになります。

Node **tail;

しかし、あなたのコードには他のバグがいくつかあります。この行では:

Node newNode = new Node(data, NULL);

ローカル オブジェクトを定義し、それに動的メモリを割り当てます。正しい方法は次のとおりです。

Node *newNode = new Node(data, NULL);  // defining it as a pointer

として ass の代わりに:

head = &newNode;

行う:

head = newNode;

最後に、生のポインターの代わりにスマート ポインターを使用することを検討してください。前者は後者よりも安全です

于 2013-09-18T17:18:36.133 に答える