2016-05-23 4 views
1

クラスプロジェクトのリンクリストを作成しようとしています。私のノードクラスには、リンクされたノードを指すポインタと、特殊なブッククラスを指す別のポインタがあります。デストラクタが呼び出されたときに、クラスのインスタンスへのポインタをnullptrに設定することはできますか?

class Node{ 
private: 
    Book *data; 
    Node *linkedLink; 
public: 
    Node(Book *inputedData); 
    Book* getBook(); 
    Node* getLinked(); 
    void changeLinked(Node *newLink); 
    Node& operator=(const Node& rhs); 

    ~Node(); //deconstructor 
}; 

私の教授は、我々変更することはできませんドライバを提供してきました。このドライバでは、彼は次のコードを持っています

// (bookList is an instance of my LinkedList class) 
// (and getFirst() returns my LinkedList's head node) 

while (bookList.getFirst() != nullptr) 
{ 
    Node * t = partsList.pop_front(); 
    delete t; 
} 

次は私のノードクラスのデストラクタです:

Node::~Node(){ 
    delete data; //this deletes the book class that data points to. 
    delete linkedLink; 
} 

問題は、私はのインスタンスを指す変数(t)を必要とする、ありますノードクラスは、に設定され、完了後に*data*linkedLinkが解放されます。しかし、私は私の教授のドライバを変更することはできません。つまり、私はこれをNodeクラスのデストラクタで行う必要があります。私はこれをどうやって行うのか困っています...教授のドライバからwhileループを抜け出すためにNodeクラスをnullptrに設定する必要はありませんか?あるいは、私はこれを完全に忘れてしまっているかもしれません。どんな助けでも大歓迎です。

======= [編集] =======

マイNodeクラスはもう、1つの他のノードのクラスを指すことはできません。これは、 "二重リンク"ではなく、 "単独リンク"リストでなければなりません。

======= [編集2.0] ========より多くのコードを求める人のため

、次は私のLinkedListクラスです。

class List{ 
private: 
    Node* head; 
    Node* tail; 
    int count; 
public: 
    List(); 
    List(Node firstLink); 

    ~List(); //deconstructor 

    Node* getFirst() const; 
    Node* getLast() const; 

    void push_back(Node *data); 
    void push_front(Node *data); 

    Node* pop_front(); 
    Node* pop_back(); 

    int getLength() const; 
    List& operator=(const List& that); 
}; 
+0

リンクリストを「単独リンク」から「二重リンク」に変更すると、簡単にこれを行うことができます。二重リンクされたリストでは、現在のノードの前後にあるノードへのポインタがあります。これにより、前のノードに現在のノードへのポインタをNULL –

+0

「自分のNodeクラスを指す変数」としてマークすることができます。 - この文は意味をなさない。変数はクラスを指しません。 –

+0

@AlexZywickiそれはうまくいくはずですが、私の先生は残念なことに、二重にリンクされたクラスではなく、 "単独でリンクされた"リストを作ってほしいと思っています。 –

答えて

5

オブジェクトが破棄されるときに、自動的にポインタをnullのどこかに設定する機能はありません。ポインタをnullに設定する必要がある場合は、デスティネータがそれを実現する責任があります。おそらく、いくつかの方法では、クラスインスタンスへのポインタを追跡するある種の機能を実装する必要があり、デストラクタでこれらのポインタはnullに設定されます。

あなたの割り当てを間違っていると私は確信しています。クラスインスタンスが破棄されるときに、ポインタがnullに設定される必要はまったくありません。

教授の不変のドライバでは、pop_front()メソッドを呼び出すと、リンクされたリストからノードを完全に削除し、削除されたノードにポインタを返します。 pop_front()の実装では、ノードをリストから完全に削除し、それに応じてすべてのリストポインタを更新して、リストの残りの要素をポイントします。

この時点では、pop_front()から返されるポインタを除いて、クラスインスタンスへの他のポインタは存在しません。このポインタはすぐにdelete dを取得します。 nullに設定する必要があるクラスインスタンスへのポインタはありません。

教授のコードはstd::listの古典的な実装であり、全く同じタスクを管理します。std::listのクラスインスタンスのデストラクタでnullへのポインタの設定を心配する必要はありません。

関連する問題