如何在向量中存储 class 的实例?

How to store an instance of class in a vector?

我已经为一个有课程和成绩的学生创建了 class,该程序一直在询问新学生,直到停止给定的名字。为了存储这些实例,我想使用向量,但除了先为实例创建一个数组然后将它们推回向量之外,我没有找到任何其他方法来存储它们。 是否可以留出一个实例空间,使用后删除Student student 中存储的值,以便重复使用?

int i=0;
Student student[20];
vector<Student> students;


cout << "Name?" << endl;
getline(cin,student[i].name);
while((student[i].name) != "stop")
{
    student[i].addcoursegrade();
    students.push_back(student[i]);
    i++;
    cout << "Name?" << endl;
    getline(cin,student[i].name);
    if((student[i].name) == "stop")
        break;

};

我还在 class 中使用向量来存储课程和成绩的值,因为它们也应该在增长。 class 的代码在这里:

class Student {
public:
    string name;

void print() {
    cout << name ;

    for (int i = 0; i < course.size(); i++)
        cout << " - " << course[i] << " - " << grade[i];
    cout<<endl;
}

void addcoursegrade() {
    string coursee;
    string gradee;

    cout << "Course?" << endl;
    getline(cin, coursee);
    course.push_back(coursee);
    while (coursee != "stop") {
        cout << "Grade?" << endl;
        getline(cin, gradee);
        grade.push_back(gradee);
        cout << "Course?" << endl;
        getline(cin, coursee);
        if (coursee != "stop")
            course.push_back(coursee);
        else if(coursee == "stop")
            break;
    }
};

private:
   vector<string> course;
   vector<string> grade;
};

与其创建数组然后返回,不如保留一个实例并重新分配它:

Student student;
vector<Student> students;

cout << "Name?" << endl;
getline(cin,student.name);
while((student.name) != "stop")
{
    student.addcoursegrade();

    // this line copies the student in the vector
    students.push_back(student);

    // then, reassign the temp student to default values
    student = {};

    cout << "Name?" << endl;
    getline(cin,student.name);
    if((student.name) == "stop")
        break;
};

有几件事困扰着我:

  • 你的循环结构方式,复制 getline。我更喜欢 while(true) 数组,在出现终止输入时中断。
  • 不需要 C 风格的数组。 std::vector 就是这样!
  • 课程和年级的单独数组。相反,我更喜欢存储课程和成绩的单个记录
  • 循环中的索引仅用于访问集合中的项目。 (只需使用基于范围的 for 循环)
  • 除非需要,否则不要创建 Student 对象。对字符串输入使用局部变量。

与 C++ 中的任何内容一样,可以做更多的事情来改进它:例如为您的对象添加构造函数、使用现代语法进行初始化、采用移动语义等。但我只是做了最小的更改。

我会这样处理:

#include <vector>
#include <string>
#include <iostream>

using namespace std;

struct CourseGrade {
    string course;
    string grade;
};

class Student {
public:
    string name;

    void print() {
        cout << name;

        for (auto& courseGrade : courseGrades) {
            cout << " - " << courseGrade.course << " - " << courseGrade.grade;
        }
        cout << endl;
    }

    void addcoursegrades() {
        while (true) {
            cout << "Course?" << endl;
            string course;
            getline(cin, course);
            if (course == "stop") break;

            cout << "Grade?" << endl;
            string grade;
            getline(cin, grade);

            CourseGrade courseGrade;
            courseGrade.course = course;
            courseGrade.grade = grade;
            courseGrades.push_back(courseGrade);
        }
    }

private:
    vector<CourseGrade> courseGrades;
};


int main() {
    vector<Student> students;

    while (true) {
        cout << "Name?" << endl;
        std::string name;
        getline(cin, name);
        if (name == "stop") break;

        Student student;
        student.name = name;
        student.addcoursegrades();
        students.push_back(student);
    };

    for (auto& student : students) {
        student.print();
    }
}