C++勉強中のものです。クラスについて、うまくわからないところがあるので質問させて下さい。
(以下のコードはC#ので書かれたものを、C++実現しようとして、書いたのでおそらく沢山ご指摘していただける部分があると思います。改善するべきところが多くあると思うので質問内容の外のご指摘も歓迎いたします。)
ノードオブジェクトに値、次のノード メンバーがあり、ShowList関数では自分の値をプリントし、次のノードを設定し、次のNodeがある限り、ループするというものです。
Nodeクラスに、自身のNode型のメンバー next を作りたいのですが、いろいろ検索した結果、ポインタかレファレンスを使わなくては実現できないと見つけ、レファレンスはその存在が保証されなければ壊れるので、避けるべきだと読みました。その結果、ポインタ、Node* next に決定しました。
質問1)一般にポインターはなるべく避けるべきと聞きますが、ポインターなしのより良い方法がありますか?
質問2) while(node != NULL) 次のノードが存在する限り、ループするというコードですが、これがうまく機能していないようです。つまり、threeまでしか、next を設定していないので、**1, 2, 3, 4 **と出力されると期待しているのですが、1, 2, 3, 4, 25, Segmentation fault:11 と出力されます。
何を改善するべきなのでしょう?
#include <iostream> class Node{ public: Node(int v); int value; Node* next; }; Node::Node(int v){ this->value = v; } void showList(Node* node){ while(node != NULL){ std::cout << node->value << "\n"; node = node->next; } } int main(){ Node one(1); Node two(2); Node three(3); Node four(4); one.next = &two; two.next = &three; three.next = &four; showList(&one); return 0; }
皆さん、ご回答ありがとうございました。色々、各解答、とても勉強になりました。一番勉強になったのは初期化の大切さです。以下、皆さんの、回答をもとに、試した、自分なりの答えです。
#include <iostream> struct Node{ Node(int val, Node* n); //初期化強制。ディフォルト無し。 ~Node(); int value; Node* next_address; }; Node::Node(int val, Node* next_addr){ this->value = val; this->next_address = next_addr; } void showList(Node* node){ while(node != nullptr){ std::cout << node->value << "\n"; node = node->next_address; } } int main(){ Node* one = new Node(1, nullptr); Node* two = new Node(2, nullptr); Node* three = new Node(3, nullptr); Node* four = new Node(4, nullptr); Node* five = new Node(5, nullptr); one->next_address = two; two->next_address = three; three->next_address = four; four->next_address = five; showList(one); // 借りたら、返す delete one; delete two; delete three; delete four; delete five; return 0; }
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/11 05:31
2019/02/12 05:24
2019/02/12 05:31
2019/02/12 07:11