我尝试制作一个简单的程序来显示名为“学生”的对象数组中的学生姓名,我知道使用 vector 可以轻松完成,但是我想使用动态数组来做到这一点。我的代码:
class Student {
public:
string name;
Student(string name){
this->name = name;
}
};
void DisplayStudentsNames(Student array[],int length) {
for(int i=0;i<length;i++){
cout << array[i].name << endl;
}
}
int main(int argc, char** argv) {
Student ** array = new Student *[3];
array[0] = new Student("Michael");
array[1] = new Student("Tom");
array[2] = new Student("Timmy");
DisplayStudentsNames(*array,3);
return 0;
}
我不确定为什么它不起作用,可以编译,但是程序在显示第一个学生姓名后只是“停止响应”。我想知道问题是什么,我已经读过here,如果Class没有任何零参数构造函数,则您无法动态创建动态对象数组,这是为什么呢?我只是将新对象辅助到指针(在C#中,这是创建类的常规方法)。
最佳答案
你的问题在这里
DisplayStudentsNames(*array,3);
您实际上传递给
DisplayStudentNames()
的是第一个元素是array
数组。问题是array[0]
不是数组,它是指向单个对象的指针。因此,当您尝试对其进行迭代时,会得到不确定的行为,在这里异常(exception)是scienorio的最佳情况(如您在无限循环中所见)。您可以通过更改来解决此问题
DisplayStudentsNames(*array,3);
至
DisplayStudentsNames(array,3);
和
DisplayStudentsNames
接受Student**
这也行不通:
cout << array[i].name << endl;
array
中的每个元素都是指向Student
对象的指针,而在C++中,通过指针访问对象需要使用->
运算符(因此应使用array[i]->name
)。边注:
Student(string name){
this->name = name;
}
这是糟糕的C++,请使用初始化列表在创建时设置成员,因为它可以优化编译器并且更易于阅读
关于c++ - 为什么在C++中我无法使用参数化构造函数声明动态对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60695015/