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()”试图初始化数组指向的所有学生
这有两个主要问题(除了循环的所有其他问题)
main
中的循环运行时,并非数组中的所有指针都指向
到现有的Student
对象。这可能会导致重要数据被删除
被覆盖、程序崩溃或其他完全不同的意外事件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;
}