-1

簡単だと思うことについて助けが必要です。学生をプロジェクトに割り当てることができます。しかし、私がプロジェクトを削除しても、学生はまだプロジェクト名を保持しています。名前を「なし」に戻そうと考えていますが、その方法がわかりません。ヘルプ?

編集 map<int, Student> mstoreしてvector<int> storeid追加しました。

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <map>
using namespace std;
class Human {
public:
    virtual void print() const = 0;
};

class Student : public Human {
protected:
    string studname;
    int studId;
    string project;
public:

    Student();
    Student (string studname, int studId) : studname("Unknown"), studId(0), project("None") 
    {
        cout << "A student is created: Name = " << studname
         << ". Id = " << studId << endl;
    }

    virtual void print() const {
    cout << "Name = " << studname << ". Id = " << studId << ". Project = " << project <<endl; }

    void setSName (string sname) { studname = sname; }
    void setSID (int sID) { studId = sID; }
    void printStudentInfo() const;
    void printStudentInfoline() const;
};

void Student::printStudentInfo() const
{
    cout << "\nStudent name: " << studname << endl;
    cout << "Student ID: " << studId << endl;
    cout << "Project: " << project << endl;
}

void Student::printStudentInfoline() const
{
    cout << studId << ", " << studname << ", " << project << endl;
}

class Project {
protected:
    string projname;

public:
    vector <Student> students;
    vector <int> storeid;

    Project (string projname) : projname(projname) { cout << "Project " << projname << " created" << endl;}

    void setPName (string projname) { this->projname = projname; }

    void add (int& sid) 
    {
        //student.setProject (projname);
        storeid.push_back(sid);
    }

    int returnid(int& a)
    {   
        return storeid[a]; 
    }

    int returnsize()
    {   return storeid.size(); }

    void printproj() const {
        cout << endl << projname << " list: \n";
        cout << "Student(s) : " << endl;
        for (int i = 0; i < storeid.size(); i++){
            cout << storeid[i] << endl;
        }
    }

    void printprojname() const {
    cout << projname << endl;
    }


};

int main() {
string StudentName;
string ProjectName;

int Studentid;

Student *s1;
Project *p1;

vector<Student> store;
vector<Project> projstore;
map<int, Student> mstore;


map<int, Student>::const_iterator itr;
    for (int n=0; n<3; n++) //loop to create 3 students
   { 
    cout <<"Enter name : ";
    getline(cin, StudentName);
    cout <<"Enter  ID : ";
    cin >> Studentid;

    s1 = new Student(StudentName, Studentid);
    s1->setSName(StudentName);
    s1->setSID(Studentid);
    store.push_back(*s1);
    mstore.insert(make_pair(Studentid, *s1));
    cin.get();
    }
    //print map
    for(itr=mstore.begin(); itr!=mstore.end() ;++itr)
    itr->second.printStudentInfo();

    //itr=mstore.begin()+2;
    //itr.print();




cout << "Enter project name: ";
getline(cin, ProjectName);

p1 = new Project(ProjectName);
p1->setPName(ProjectName);

 //Assigning student to project
    cout << endl;
    cout << "How many students? :" ;

    int y;
    cin >> y;
    for ( int i = 0; i < y; i++){
    cout << "Who would you like to add to this project?" << endl;
    int x = 1;

    for(itr=mstore.begin(); itr!=mstore.end() ;++itr)
    itr->second.printStudentInfoline();

    int insID;
    cout << "Enter ID number: ";
    cin >> insID;
    p1->add(insID);

    /*
    for ( it = store.begin(); it != store.end(); ++it ) {
        // For each friend, print out their info

    cout << x << ". ";
          it->printStudentInfoline();
    x++;

    }
    x = 1;  
    int insS;
    cout << "Enter number: ";
    cin >> insS;
    p1->add(store[(insS-1)]);   //stores selected student into the object
    */

    cout << "\nAdding Student done\n" << endl;
    }
    projstore.push_back(*p1);

    //Mstore finds for related ids and displays them accordingly
cout << "print project"<< endl;
    vector<Project>::iterator pt;
    for ( pt = projstore.begin(); pt != projstore.end(); ++pt ) {
        pt->returnsize();
        for (int i=0; i <pt->returnsize(); i++){
        cout << pt->returnid(i) << endl;

        itr=mstore.find(pt->returnid(i));

        itr->second.printStudentInfo();
        }            
    }


    cout << endl;
    cout << "Deleting project" << endl;
    cout << "What would you like to remove?" << endl;
    int x = 1;

    //storeid will display ids. How do I link them to `store` map?
    for ( pt = projstore.begin(); pt != projstore.end(); ++pt ) {
      cout << x << ". ";
      pt->printprojname();
      x++;
    }


    //Now to delete the selected project
    int delP;
    cout << "Enter number: ";
    cin >> delP;
    cin.ignore();
    system("pause");
    projstore.erase(projstore.begin()+delP-1);

// Students

cout << "\n Current students" << endl;
for(itr=mstore.begin(); itr!=mstore.end() ;++itr)
    itr->second.printStudentInfo();

}
4

1 に答える 1

1

プロジェクトに生徒を追加する方法を見てください。

void add (Student& student)
{
  student.setProject (projname);
  students.push_back (student);    // <-- AHA!
}

最初にプロジェクト名を生徒に割り当てると、プロジェクトは生徒のコピーを保存します。その後、プロジェクトは元の生徒とのつながりがなくなり、時が来ても自分の終焉を知らせることができません。

この設計を再考する必要があります。3 つの主なオプションがあります。1) 学生はストアでそれぞれのプロジェクトを検索できます。2) プロジェクトはstudentsベクターで学生を検索できます。または 3) プロジェクトは学生を所有しています (この場合、学生はおそらく GraduateStudents である必要があります)。 )。

編集:
それがあなたのやり方である場合はmap<int, Student> store、ID番号をインデックスとして使用して学生を保存するために使用します。次に、プロジェクトはvector<int>(またはset<int>) の学生 ID 番号を持つことができます。店内の学生を簡単に見ることができます。

編集:
学生のコレクション全体を印刷するには:

for(map<int, Student>::const_iterator itr=store.begin(); itr!=store.end() ;++itr)
  itr->second.print();

編集:
プロジェクトに複数vector<int>の学生 ID 番号がある場合、どのような引数を取るべきだと思いますProject::add(?)か?

編集:
プロジェクトは、学生 ID 番号と次へのアクセスを使用して、学生に作用することができますmstore

// in Project:
mstore[id].whatever()

編集:
正しい質問をすること (この場合は、質問を正しく言い表すこと) が戦いの半分である場合もあります。「「なし」を挿入されたプロジェクト名に変更するにはどうすればよいですか?」より適切な言い方は、「プロジェクトはどのようにして生徒の 1 人をproject「なし」から に変更するのprojnameか?」です。そのように言えば、答えはほぼ明白です。

// in Project:
mstore[id].setSProject(projname);

Studentにはまだ がないことに注意してくださいsetSProject(string)。追加する必要があります。また、このソリューションは理想的ではないことに注意してください。1) 誰でも Student を変更できproject、2) Studentprojectは実際のプロジェクトの名前である必要はないからです。これらの問題に対処する方法は複数あります。

于 2012-08-31T03:57:44.550 に答える