增加类指针数组

时间:2019-02-18 05:20:27

标签: c++

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

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;
        }
}

我的Main.cpp文件

int *totalStudent = new int;
*totalStudent = 1;
int i, j, countStudent = 0;
int sizeOfArray = *totalStudent;
Student *newStudent[*totalStudent];
//Each time a new student is added, I will allocate a new memory for the array element, then add student Info using function.
    for (i = countStudent; i < *totalStudent; i++)
        {   
            newStudent[i] = new Student;
            newStudent[i]->AddStudent(newStudent, countStudent, sizeOfArray);
            countStudent++;
            *totalStudent++;
        }

运行代码时,出现未定义的引用错误,因此我不知道是否可以增加数组。我打算使用C ++语法,所以我使用new和delete。谢谢您的帮助。 P.S:这是我的新代码,运行效果很好,唯一缺少的是数组中第一个元素的studentID。 在我的主要班级:

int numStudent = 0;
int i, j, countStudent = 1;
Student *newStudent = new Student[countStudent];
AddStudent(newStudent, countStudent, numStudent);

我的学生。h

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

};
Student AddStudent(Student *newStudent, int &countStudent, int &numStudent);

和我的Student.cpp

    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;
        }
}

运行此代码将给我以下结果:

StudentID: 11
StudentName: Dat
StudentID: 23
StudentName: Michael
Printing:
StudentID: 0
StudentName: Dat
StudentID: 23
StudentName: Michael

2 个答案:

答案 0 :(得分:0)

addStudent对它所属的Student对象不做任何事情。因此,无需将其放在“学生”类中。 (或者,您宁愿重写它,以便它使用它所属的Student对象执行某些操作)。而且它目前不“添加”任何东西,因此名称令人困惑。

技术上的错误取决于您要执行的操作。当前,它会初始化一个预期存在的学生对象,该对象由一个数组指向,从特定的数组索引到该数组的末尾。如果那正是您想要的功能,那可能是一个有用的功能。但是,然后必须使用指向有效Student对象的指针数组正确调用它,而您当前还没有。

目前在main中,您有一个循环初始化数组中的指针。并且每次初始化指针时,都调用AddStudent(..)。问题是'AddStudent()'试图初始化数组指向的所有学生。

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

  1. 每次创建新学生时,所有现有学生将   再次使用std :: cin的新输入进行初始化。 (所以对于n个学生,您将   尝试进行n * n次初始化)

  2. 虽然main中的循环正在运行,但并非数组中的所有指针都指向   到现有的Student对象。这可能会导致重要数据   被覆盖,程序崩溃或完全不同且出乎意料的事情。

您应该坐下来重新评估您想做的事情。尝试一次又一次地修复现有代码中的单个错误,只会创建更多的错误。

只是一个提示,可以帮助您入门:

class Student
{
public:
    int studentID;
    char studentName[20];
    int currentEnrollment;
    Student();
    void init_from_cin();
};

在您的类定义文件中:

void Student::init_from_cin()
{
   cout << "Please enter student id (4 digits only): ";
   cin >> studentID;
   cout << "Please enter student name: ";
   cin >> studentName;
}

如果您像这样创建新的Student

Student *new_student = new Student;
new_student->init_from_cin();

然后在调用init_from_cin()之后,应初始化Student指向的new_student对象。

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

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

答案 1 :(得分:0)

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

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

   int main(){
   int studentCount=1;
   Student * students = new Student[studentCount];

    int numStudents=0;    
    bool done=false;    
    char finished='N';

    while (!done){

          //Student *tempStudent = new Student();
          //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

  //print the students info
    for(int i=0;i<numStudents;i++){
            Student st = students[i];
            cout << st.studentID << "     "  << st.studentName << std::endl;

    }
    //deallocate the students array or if you place this in the main like you did, the program will exit immediately so there's no need to deallocate
    return 0;
    }

Student * ReallocateStudents(Student* st, int oldSize, int newSize){

                Student * newStudents = new Student[newSize];

                //copy the existing values from the old array to the new one

                for(int i=0;i<oldSize;i++){

                    newStudents[i] = st[i];
                }
                delete [] st; //delete the old array

                return newStudents;  
}

更新:

由于您不想在main()中做任何事情,因此只需创建一个免费的AddStudents函数,然后在其中执行所有操作即可。或者,您可以创建一个  Student类中的静态函数。将AddStudent创建为Student的成员没有任何意义,因为这将要求您使用Student实例来添加新实例,这会导致不良的设计(更不用说技术问题了)

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;
}

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