44377


C言語を終えてC++の初学者なんですが、C言語のリスト処理をクラスを使って書いてみようと思い自分なりに書いているのですが。下のあたりのコメントで`[//書き込みアクセス違反]`となっている部分の修正方法を教えてもらいたいです。できれば解説もお願いします。

[code]

    /*
    int main(){
        list test;
        test = 5;
    
        _getch();
    
        return 0;
    }
    */
    
    /*
    class list {
        private:
            typedef struct struct_list {
                int height, width;
                string name;
    
                struct struct_list *prev, *next;
    
            }st_list;
    
            st_list *p, *t,*date; int n;
            st_list *start;//先頭のポインタを保存
            int number;//入力した数
    
        public:
            list():n(0),number(0){};//デフォルトコンストラクタ
    
            list(int x);//コンストラクタ
    };
    */
    
    list::list(int x) {
        number = x;//リスト作成数を決める
        int a = 0;
    
        do {
        /*
        do {
            cout << "リストを作りますか? [YES --- 0 / NO --- 9]: ";
            cin >> n;
    
            if (n != 0 && n != 9)
            {
                cout << "0か9を入力してください\n";
            }
        } while (n != 9);
        */
    
            date = new st_list;
    
            cout << "身長を入力してください:"; cin >> date->height;
            cout << "名前を入力してください:"; cin >> date->name;
            cout << "体重を入力してください:"; cin >> date->width;
    
            date->next = NULL;
    
            if (start == NULL)
            {
                date->prev = NULL;
                start = date;
                p = date;
            }
            else {/*先頭以降*/
                p->next = date;//書き込みアクセス違反
                date->prev = p;
                p = date;
            }
    
            ++a;
    
        } while (a != number);
    
    }
    
[/code]


CC BY-SA 4.0
2018-05-29T14:57:47.833
44373
2018-05-29T17:44:51.573
2018-05-29T16:13:14.563
3060
question
c++ c++11
リスト処理をする自前クラスで、書き込みアクセス違反が出る。


メンバー変数`start`が、初期化されていないようです。C++の仕様では、初期化されていないポインタの値は不定で、何が入っていても構いません。`nullptr`以外の値が入っていると、一番最初の要素を追加するときでも、`if
(start ==
NULL)`が`false`になってしまい、`else`の部分が実行されてしまいます。一番最初だと、`p`もまだ初期化されておらず、書き込みアクセス違反などの、いろいろな問題が起きてしまいます。

[code]

    list::list(int x) : start(nullptr) {
    
[/code]

などのように、`start`を`nullptr`に初期化しましょう (デフォルトコンストラクタでも同様に)。


CC BY-SA 4.0
2018-05-29T16:35:47.780
44377
2018-05-29T17:44:51.573
2018-05-29T17:44:51.573
3605
3605
44373
answer