現在、データ構造に関する書籍を読んでいて、側面でC++を学んでいます。私は単純なリンクリストを実装しようとしています。以下は、(問題を特定するために)最大2つの要素を取ることのできるリストのコードです。 間違っているのは、リスト内の次のノードへのポインタ宣言です。新しいNode
インスタンスを作成してそのインスタンスへのポインタを作成すると、ポインタは各メソッド呼び出しで同じ状態を維持するため、リスト内のすべての要素は同じノードを指しています。ただし、ポインタを直接作成すると、すべてが正常に動作します。各メソッド呼び出しでローカル変数ポインタが上書きされる
私が推測しているのは、ポインタ、参照、およびnew
キーワードの基本的な誤解があることです。
以下のコードを自由に実行してください。作業コードはコメントアウトされています。このコードは正確にうまく設計されていないことを
#include <iostream>
using namespace std;
template <typename T> class Node {
public:
Node(T nvalue) {
this->value = nvalue;
this->next = NULL;
}
T value;
Node *next;
};
template <typename T> class LinkedList {
public:
Node<T> *head;
LinkedList() {
this->head = NULL;
}
void append(T newVal) {
// Correct
// Node<T>* newNode_ptr = new Node<T>(newVal); // newNode_ptr is different on each call
// Incorrect!?
Node<T> newNode = Node<T>(newVal);
Node<T> * newNode_ptr = &newNode; // newNode_ptr is the same on each call
cout << "New Node Address: " << newNode_ptr << endl;
if (!(this->head)) {
this->head = newNode_ptr;
cout << "Value 0: " << this->head->value << endl;
} else {
this->head->next = newNode_ptr;
cout << "Value 0: " << this->head->value << endl;
cout << "Value 1: " << this->head->next->value << endl;
}
}
};
int main() {
LinkedList<int> list = LinkedList<int>();
list.append(21);
cout << "..." << endl;
list.append(42);
}
は注意(いくつかのものがprivateである必要があり、using namespace std
は避けるべきです)。私はこのポインタのものが少し圧倒的なので、Pythonに精通しています。事前にあなたの助けをありがとう!
***ノード * newNode_ptr =&newNode; *** 'newNode'が有効範囲外になると未定義の動作になります。 –
drescherjm
@drescherjm彼らは一緒に範囲外に行くので、問題は見えません。 – user
ちょっとしたアドバイス - データ構造を作成するときは、最初に特定の種類のデータ構造を作成してください。あなたはそれが働いてテストされているときだけ、それをテンプレートに変えてください。 –