当我尝试创建对象数组时出错

Error when I try to create array of object

本文关键字:数组 出错 创建对象      更新时间:2023-10-16

我有点困惑,对我来说,我认为以下两个实现是有效的(但我的语法有错误),但我无法让其中任何一个工作。这是一年级C++入门课作业,我们不能使用 Vector(否则早就完成了......

我已经完成了我的课程Student,但现在我必须创建一个容器来存储 n 个学生。我在想以下两个选项。

1) 创建学生对象数组:Student arrayOfStudents[20];

我的学生课很简单(因为行太多而修改不同)。但是这个想法是这样的...

class Student
{
    public:
    // Constructor for the Book class, take 6 arguments 
    Student(string myUID, string myLastName, string myFirstName, 
         string major, string age, string homeState, bool isWorking);
    ...
};

但是当我尝试创建学生数组时,我收到此错误消息。

cs114p2main.cpp: In function ‘int main(int, char**)’:
cs114p2main.cpp:103: error: no matching function for call to ‘Student::Student()’
cs114p2Student.h:14: note: candidates are: Student::Student(std::string*)
cs114p2Student.h:11: note:                 Student::Student(std::string, std::string, std::string, std::string, std::string, bool)
cs114p2Student.h:7: note:                 Student::Student(const Student&)

2)还尝试过:创建一个指向每个学生的学生指针数组。 Student* ArrayOfStudents = Student[20];

我的问题是为什么方法 1 不起作用?在这种情况下,我是否必须使用指针(类似于方法 2)。

因为我需要将此数组传递到将设置每个学生的函数中。(我不知道有多少学生会在那里)。那么这是否意味着我必须传递指向学生数组的指针?在这种情况下,我真的希望方法 1 可以工作,我无法想象处理指向学生指针数组的指针。我在想必须返回一个data[numOfData][numOfStudnet]数组,并主要这样做,但无论哪种方式,我都想弄清楚为什么这会给我带来错误。谢谢。

编辑:Follwo up问题:我知道通过研究,我必须将Student数组的大小声明为参数,但是如果我只知道它运行后的大小怎么办?在这种情况下,我有什么选择?

你的Student类只有一个构造函数,即

Student(string myUID, string myLastName, string myFirstName,  
     string major, string age, string homeState, bool isWorking); 

因此,编译器不会生成默认构造函数。 由于您也没有提供一个(默认 ctor:一个没有参数的可调用对象),编译器无法创建数组 - 它需要默认可构造的对象来放置在元素中(初始化数组)。

要解决此问题,您需要提供默认 ctor:

Student();

您需要根据假定Student的行为来了解自己的行为。

您还可以为列出的 Student ctor 的所有参数提供默认参数,因此无需显式指定任何参数即可调用 - 因此有资格作为默认 ctor

如果默认 ctor 不可行,您将需要变得更有创意并动态分配数组,将所有现有元素复制到新元素,并在需要时将给定的新元素分配给它。 请注意,这样做实际上是在重新创建std::vector容器的功能。 另请注意,这种方法真的很难做到正确,所以我建议不要这样做,特别是因为你只是在学习基础知识。

另一种方法是创建一个指向Student的指针数组,以便您可以在动态创建它们时分配每个指针。 在尝试访问指向的Student对象之前,必须测试该元素是否为 null 指针。

Student* students[20];
students[0] = new Student(/*list of actual parameter values*/);
if (student[0] != NULL) {
  students[0]->getName(); // assuming you have a member function getName()
}

注意:索引 0 仅用于说明目的,您也可以使用变量(只要确保它保持在 0 和 19(含)之间 - 请注意,即使您有 20 个元素,最大的索引也是 19,因为计数从 0 开始

我的问题是为什么方法 1 不起作用?

因为Student没有默认构造函数(没有参数的构造函数)。仅当未定义构造函数时,编译器才会生成默认构造函数。由于已定义至少接受一个参数的构造函数,因此不存在默认构造函数。声明数组时:

Student arrayOfStudents[20];

正在使用不存在的默认构造函数创建 20 个 Student 实例。

您可以定义一个允许使用该数组的默认构造函数,但是没有名称、年龄等Student存在是否有意义?

或者,使用一组Student*

Student* arrayOfStudents[20] = {}; // The '{}' will set all pointers to NULL.

编辑:

如果学生人数直到运行时才知道,则:

// Get number of students somehow.
int numberOfStudents = ...;
// The '()' will set all pointers to NULL.
Student** arrayOfStudents = new Student*[numberOfStudents]();

请记住delete arrayOfStudents中的每个条目,并delete[] arrayOfStudents本身。