gpt4 book ai didi

c++ - 为什么在C++中我无法使用参数化构造函数声明动态对象数组?

转载 作者:行者123 更新时间:2023-12-01 14:53:21 24 4
gpt4 key购买 nike

我尝试制作一个简单的程序来显示名为“学生”的对象数组中的学生姓名,我知道使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com