Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 递增类指针数组_C++ - Fatal编程技术网

C++ 递增类指针数组

C++ 递增类指针数组,c++,C++,在我的代码中,我想将一个学生信息添加到我的类指针数组中,每次添加一个新学生时,数组大小都会增加。这是我的密码: 我的头文件: class Student{ public: int studentID; char studentName[20]; int currentEnrollment; Student(); void AddStudent(Student *tempStudent[], int countStudent, int sizeOfArray);}

在我的代码中,我想将一个学生信息添加到我的类指针数组中,每次添加一个新学生时,数组大小都会增加。这是我的密码: 我的头文件:

class Student{
public:
    int studentID;
    char studentName[20];
    int currentEnrollment;
    Student();
void AddStudent(Student *tempStudent[], int countStudent, int sizeOfArray);}
我的类定义文件:

    void Student::AddStudent(Student *tempStudent[], int countStudent, int sizeOfArray)
{
    for (int i = countStudent; i < sizeOfArray; i++)
        {
            cout << "Please enter student id (4 digits only): ";
            cin >> tempStudent[i]->studentID;
            cout << "Please enter student name: ";
            cin >> tempStudent[i]->studentName;
        }
}
void Student::init_from_cin()
{
   cout << "Please enter student id (4 digits only): ";
   cin >> studentID;
   cout << "Please enter student name: ";
   cin >> studentName;
}
我的学生

    class Student{
    public:
        int studentID;
        char studentName[20];
        int currentEnrollment;

};
Student AddStudent(Student *newStudent, int &countStudent, int &numStudent);
还有我的学生

    Student AddStudent(Student *newStudent, int &countStudent, int &numStudent)
{
        Student tempStudent;
        cout << "Please enter student id (4 digits only): ";
        cin >> tempStudent.studentID;
        cout << "Please enter student name: ";
        cin >> tempStudent.studentName;
        newStudent[numStudent] = tempStudent;
        numStudent++;
        if (numStudent == countStudent)
        {
            Student *newStudentSize = new Student[countStudent + 1];
            for (int i = 0; i < numStudent; i++)
            {
                newStudentSize[i] = newStudent[i];
            }
            delete []newStudent;
            return *newStudentSize;
            countStudent += 1;
        }
}

addStudent
不处理它所属的
Student
对象。所以没有必要把它放在“学生”课上。(或者您可以重写它,使其与它所属的student对象一起执行某些操作)。而且它目前没有“添加”任何内容,因此名称令人困惑

技术上它有什么问题取决于你想要它做什么。当前,它初始化预期已存在并由数组指向的学生对象,从特定数组索引到数组末尾。如果你想让它这样做的话,这很可能是一个有用的函数。但是您必须使用指向有效
Student
对象的指针数组正确地调用它,而您当前没有这样做

目前,您主要有一个初始化数组中指针的循环。每次初始化指针时,调用AddStudent(..)。问题是“AddStudent()”试图初始化数组指向的所有学生

这有两个主要问题(除了循环的所有其他问题)

  • 每次创建新学生时,所有现有学生都将 使用来自std::cin的新输入再次初始化。(因此,对于n名学生,您将 尝试进行n*n次初始化)

  • main
    中的循环运行时,并非数组中的所有指针都指向 到现有的
    Student
    对象。这可能会导致重要数据被删除 被覆盖、程序崩溃或其他完全不同的意外事件

  • 你应该坐下来重新评估你想怎么做。试图一个接一个地修复现有代码中的单个bug只会产生更多bug

    只是给你一个开始的提示:

    class Student
    {
    public:
        int studentID;
        char studentName[20];
        int currentEnrollment;
        Student();
        void init_from_cin();
    };
    
    在类定义文件中:

        void Student::AddStudent(Student *tempStudent[], int countStudent, int sizeOfArray)
    {
        for (int i = countStudent; i < sizeOfArray; i++)
            {
                cout << "Please enter student id (4 digits only): ";
                cin >> tempStudent[i]->studentID;
                cout << "Please enter student name: ";
                cin >> tempStudent[i]->studentName;
            }
    }
    
    void Student::init_from_cin()
    {
       cout << "Please enter student id (4 digits only): ";
       cin >> studentID;
       cout << "Please enter student name: ";
       cin >> studentName;
    }
    
    然后,在从\u cin()调用
    init\u之后,
    new\u Student
    指向的
    Student
    对象应该初始化

    如何在循环中创建和初始化多个
    Student
    对象,留给读者作为练习。但当您这样做时,您应该了解循环的上下限应该是什么。您还应该理解为什么在循环运行时将上限移动得更远是个坏主意


    不要忘记,sane编程语言从0开始建立数组索引。

    addStudent
    不处理它所属的
    Student
    对象。所以没有必要把它放在“学生”课上。(或者您可以重写它,使其与它所属的student对象一起执行某些操作)。而且它目前没有“添加”任何内容,因此名称令人困惑

    技术上它有什么问题取决于你想要它做什么。当前,它初始化预期已存在并由数组指向的学生对象,从特定数组索引到数组末尾。如果你想让它这样做的话,这很可能是一个有用的函数。但是您必须使用指向有效
    Student
    对象的指针数组正确地调用它,而您当前没有这样做

    目前,您主要有一个初始化数组中指针的循环。每次初始化指针时,调用AddStudent(..)。问题是“AddStudent()”试图初始化数组指向的所有学生

    这有两个主要问题(除了循环的所有其他问题)

  • 每次创建新学生时,所有现有学生都将 使用来自std::cin的新输入再次初始化。(因此,对于n名学生,您将 尝试进行n*n次初始化)

  • main
    中的循环运行时,并非数组中的所有指针都指向 到现有的
    Student
    对象。这可能会导致重要数据被删除 被覆盖、程序崩溃或其他完全不同的意外事件

  • 你应该坐下来重新评估你想怎么做。试图一个接一个地修复现有代码中的单个bug只会产生更多bug

    只是给你一个开始的提示:

    class Student
    {
    public:
        int studentID;
        char studentName[20];
        int currentEnrollment;
        Student();
        void init_from_cin();
    };
    
    在类定义文件中:

        void Student::AddStudent(Student *tempStudent[], int countStudent, int sizeOfArray)
    {
        for (int i = countStudent; i < sizeOfArray; i++)
            {
                cout << "Please enter student id (4 digits only): ";
                cin >> tempStudent[i]->studentID;
                cout << "Please enter student name: ";
                cin >> tempStudent[i]->studentName;
            }
    }
    
    void Student::init_from_cin()
    {
       cout << "Please enter student id (4 digits only): ";
       cin >> studentID;
       cout << "Please enter student name: ";
       cin >> studentName;
    }
    
    然后,在从\u cin()调用
    init\u之后,
    new\u Student
    指向的
    Student
    对象应该初始化

    如何在循环中创建和初始化多个
    Student
    对象,留给读者作为练习。但当您这样做时,您应该了解循环的上下限应该是什么。您还应该理解为什么在循环运行时将上限移动得更远是个坏主意


    永远不要忘记,理智的编程语言从0开始数组索引。

    虽然为每个新学员增加数组是没有意义的(这是低效的),但有一种方法可以做到这一点(我甚至没有尝试让您的代码编译,因为它有许多问题,而且不必要地复杂)。请注意,
    tempstuent
    (在下面的代码片段中)甚至不必使用
    new
    创建。此解决方案将
    Student
    对象存储在students数组中(尽管很容易将其修改为存储
    Student
    对象指针)。也就是说,通常情况下,您只需要创建一个足够大的数组来容纳所有学生(只需将
    studentCount
    设置为适当的数字,而不是下面示例中的1)


    这很简单,易于理解和维护,因此我建议使用这种方法。

    虽然为每个新学员增加数组没有意义(效率很低),但有一种方法可以做到(I
    int main(){
    
    // some code here
     Students * allStudents = AddStudents();
    
    //print students
    }//end main
    
     Students * AddStudents(){
    
       int studentCount=1;
    
       Student * students = new Student[studentCount];
    
        int numStudents=0;    
        bool done=false;    
        char finished='N';
    
        while (!done){
    
              //create a Student on the stack
              Student tempStudent;
    
              cout << "Please enter student id (4 digits only): ";
              //No input checking is done here
              cin >> tempStudent.studentID;
              No input checking is done here
              cout << "Please enter student name: ";
    
              cin >> tempStudent.studentName;
    
              students[numStudents] = tempStudent;
    
              numStudents++;
    
              cout << "Stop entering students:  Y or N";
    
              cin >> finished;
    
              done = finished=='Y' or finished=='y' ? true : false;
    
    
              if(numStudents==studentCount){
    
                  students = ReallocateStudents(students, studentCount, 
                  studentCount*2);
    
                  studentCount *= 2;
    
                        }
        }//end while
    
       return students;
    }