-1

プロジェクトのリンクリストを作成しようとしています。これらの2つのファイル(1つは.h、もう1つは.cpp)があります。コピーコンストラクターの作成方法がわからないので、それがそれと関係があるかどうかはわかりません。誰かが私をその上で正しい方向に向けたいと思ったら、それは役に立つと思います。ありがとうございました。

#include <iostream>
#include "studentList.h"

using namespace std;

// Default Constructor for StudentList
// Creates Dummy Head Node for a new empty list
StudentList::StudentList ()
{
// Create the dummy head node
Node* Head;             // Creates Head Node
Head = new Node;        
Head->next = NULL;      // Sets pointer to NULL by default
}

//Copy Constructor
StudentList::StudentList(const StudentList& list)
{

}

void StudentList::addStudentList(Student newStudent)
{

ここでエラーが発生します!!!!!!

if (Head->next == NULL)
{
    Head->next->student = newStudent;
    Head->next->prev = Head;
    Head->next->next = NULL;
}
}

これが.hファイルです

#include <iostream>
#include "Student.h"

using namespace std;


class StudentList{

public:
//Default Constructor
StudentList();
//Copy Constructor
StudentList(const StudentList& list);
//Add Student Method
void addStudentList(Student);


private:
// Node struct to hold Student data and with pointers to a previous and next node in linked list
struct Node {
Student student;
Node* prev;
Node* next;
};

};
4

2 に答える 2

3

Headメンバーになるはずです。作成したポインタHeadには自動ストレージがあります。コンストラクターが終了するとスコープ外になり、ぶら下がっている参照を取得します。

class StudentList{

public:
//Default Constructor
  StudentList();
//Copy Constructor
  StudentList(const StudentList& list);
//Add Student Method
  void addStudentList(Student);


private:
// Node struct to hold Student data and with pointers to a previous and next node in linked list
  struct Node {
    Student student;
    Node* prev;
    Node* next;
  };

  Node* Head;

};


StudentList::StudentList ()
{
  Head = new Node;        
  Head->next = NULL;      // Sets pointer to NULL by default
}

ちなみに、中括弧の間に置いたコードはインデントする必要があります。これにより、人間の読者は、関連する要素をグループ化して、コードブロックを見つけることが容易になります。

コピーc'torについては、ご覧のとおり、既存のオブジェクトへの参照を取得し、そこから新しいオブジェクトを作成します。コンパイラによって提供されるdefaulutコピーc'torは、浅いコピーを実行します。意味はリストでありa、同じ開始要素を指します。これをオーバーライドして、次のようなディープコピーを実行できます。ba.Headb.Head

StudentList::StudentList(const StudentList& list)
{
  Node* Head = new Node;
  Node* tmp = Head;
  Node* iter = list.Head;
  while (iter)
  {
    *tmp = *iter;
    tmp->next = NULL;
    if (iter->next)
      tmp->next = new Node;
    tmp = tmp->next;
    iter = iter->next;
  }
}

もちろん私は無視tmp->prevしましたが、それはサインリンクリストの一般的な考え方です。

于 2013-02-02T18:20:22.570 に答える
1

これはここです

StudentList::StudentList ()
{
// Create the dummy head node
Node* Head;             // Creates Head Node
Head = new Node;        
Head->next = NULL;      // Sets pointer to NULL by default
}

StudentListが構築された後に存在しなくなるctorのローカル変数を作成しています。Headクラスメンバーになるように、つまりヘッダーファイルで宣言するように移動する必要があります

class StudentList {
..
Node* Head;
};

したがって、コンストラクタは代わりに次のようになります。

StudentList::StudentList ()
{
// Create the dummy head node
Head = new Node;        
Head->next = NULL;      // Sets pointer to NULL by default
}
于 2013-02-02T18:20:51.727 に答える