使用动态分配创建数组并将元素插入其中

Using dynamic allocation to create an array and insert elements into it

我想做一个图书馆管理系统作为作业

class student
{
          char ID_number[30];
          char Student_name[30];
      public:
          void create_student()
          {
                    cout<<"\nEnter The ID Number ";
                    cin>>ID_number;
                    cout<<"\n\nEnter The Name of The Student: ";
                    cin>>Student_name;

                    cout<<"\n\nStudent Created Successfully"<<endl;
          }
          void show_student()
          {
                    cout<<"\nID Number: "<<ID_number;
                    cout<<"\nStudent Name: ";
                    cin.getline(Student_name,30);


          }

我将如何使用动态分配使每个新条目进入数组并使用指针显示某个学生?

这部分我真的很烂,在此先感谢!

由于您是用 C++ 而非 C 编写代码,因此我建议使用字符串 class,如 std::string,而不是原始 char 数组,例如:

std::string student_name;

如果你想在内存中存储学生列表,我建议使用 std::vector 容器,例如:

std::vector<Student> students;

您可以使用vector::push_back方法将新学生添加到容器中。


编辑 如果你想使用 new[]delete[] 作为学习练习,你可以分配一大群学生,然后使用数组中的整数索引,指向第一个插入新学生的空闲槽。 例如:

int capacity = 100;
Student* students = new Student[capacity];

int student_count = 0;

要添加新学生,请将其复制到 student_count 给出的数组索引中,然后将此变量递增 1,指向预分配数组中的下一个空闲位置。

一定要注意不要溢出数组的容量。一旦预分配的数组已满,如果你想添加一个新学生,你需要分配一个更大容量的新数组。您可以使用 2 倍或 1.5 倍比例因子来计算新容量。

别忘了释放之前用delete[]分配的内存。

如果你这样做,你基本上是从头开始实施 std::vector(即使这个标准容器具有额外的高级功能,如移动语义等)。

std::vector<student>std::vector<student*> 如果你想要 pointer.

添加新学生:

Student* newStudent = new Student(name);

vector.append(newStudent);

正在读一个叫"Victor"的学生然后删除:

Student* victor;
for(int i = 0; i<vector.size();i++) {
    if(vector.at(i)->getName() == "Victor") {
        victor = vector.at(i);
        break;
    }
 }
//Then you can delete it
delete(victor);

std::vector

如果动态是指您想要创建 "a few" 学生记录,但不确定有多少不需要担心新建或删除。只需使用矢量。

std::vector<student> students;
while(!bored)
{
    student latest;
    latest.creat_student(); // this looks a bit odd, perhaps it should be a free function...
    vector.push_back(latest);
    //TODO - see if I am bored yet
}

现在我们有学生了。你说你想用指针来显示它们。或者更确切地说是某个学生。你还没有描述你将如何选择"certain student",所以让我们先展示它们

for (auto item : students)
{
    item.show_student();
}

令人失望的是,您的 show_student 方法未声明为 const,您应该考虑这一点。

要为特定学生编制索引,您可以使用 students[17]。或者你想要哪个索引。如果您提供一种获取属性的方法(当然考虑使用 std::string 而不是 char *


如果你真的想使用 student 的原始数组,那么像这样的东西是可行的,但如果 5 或你选择的任何东西都不够,你将进入 reallocs 等。这是选择 std::vector.

的一个令人信服的理由
student * them = new student[5];
for (size_t i = 0; i < 5; ++i)
{
    student latest;
    latest.create_student();
    them[i] = latest;
}

for (size_t i = 0; i < 5; ++i)
{
    them[i].show_student();
}
delete[] them;