c++ - 为什么在 C++ 中我不能使用参数化构造函数声明对象的动态数组?
问题描述
我尝试制作一个简单的程序,该程序将显示来自名为“Student”的对象数组中的学生姓名,我知道使用向量可以轻松完成,但我想使用动态数组来做到这一点。我的代码:
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;
}
我不确定为什么它不起作用,它确实编译但程序在显示第一个学生姓名后只是“停止响应”。我想知道问题是什么,我在这里读到如果 Class 没有任何零参数构造函数,则您无法动态创建动态对象数组,我想知道为什么会这样?我只是将新对象分配给指针(在 C# 中,这是创建类的正常方式)。
解决方案
你的问题在这里
DisplayStudentsNames(*array,3);
您实际上传递给DisplayStudentNames()
这里的是第一个元素是数组array
。问题是它array[0]
不是一个数组,它是一个指向单个对象的指针。因此,当您尝试迭代它时,您会得到未定义的行为,一个异常将是这里最好的情况(正如您在无限循环中看到的那样)。
您可以通过更改来解决此问题
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++,使用 initaliser 列表来设置创建成员,因为它允许编译器优化并且更易于阅读
推荐阅读
- ios - 轮换时如何避免约束冲突?
- mysql-cli - 清除做什么?
- android - Firebase 忽略超类上的排除
- json - 如何在不使用 Codable 协议的密钥的情况下解码 JSON 字典
- android - 如何使用 Leanback 库在 Android TV 中创建顶部导航栏
- apache-spark - Mockito 验证不适用于序列化/反序列化模拟
- php - 如何在 PHP 中制作排名列表?
- c# - 如何在 VS2019 中正确设置 WCF 接口和类的属性?
- discord.py-rewrite - 如何让机器人在 5 秒后删除自己的消息
- rust - 如何告诉编译器在不删除整个结构的情况下释放结构中的借用?