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

标签 c++ arrays object dynamic

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

相关文章:

c++ - 如果 C++ 中的长度大于 n,则跳过读取 INI 文件中的一行

ios - 如何对字符串的日期进行排序?

c++ - 如果我想加密文本,可以使用哪个 c++ 免费(无 GPL)库?

c++ - 顺序独立的可变参数模板参数

c++ - std::sort 没有复制构造

arrays - 如何在 Rust 中交换多维数组的值?

java - 为什么我的数组不打印出我的输入?

javascript - 将对象数组过滤为对象

java - 检查List对象是否为空

c++ - 使 C++ 对象数组在 Python 中可迭代