首页 > 解决方案 > 为什么在 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# 中,这是创建类的正常方式)。

标签: c++arraysobjectdynamic

解决方案


你的问题在这里

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 列表来设置创建成员,因为它允许编译器优化并且更易于阅读


推荐阅读