C++ 尝试创建对象数组时出错

C++ 尝试创建对象数组时出错,c++,arrays,class,pointers,C++,Arrays,Class,Pointers,我感到有点困惑,对我来说,我认为下面两个实现是有效的,但是我的语法有错误,但是我不能让它们中的任何一个工作。这是一个1年C++ C++的家庭作业,我们不能用向量,否则它会在很久以前做……/P> 我已经完成了我的学生课程,但是现在我必须创建一个容器来存储n个学生。 我在考虑以下两种选择 1创建学生对象数组:学生数组学生[20] 我的学生课很简单,因为太多的行,所以修改了。但是这个想法是这样的 class Student { public: // Constructor for th

我感到有点困惑,对我来说,我认为下面两个实现是有效的,但是我的语法有错误,但是我不能让它们中的任何一个工作。这是一个1年C++ C++的家庭作业,我们不能用向量,否则它会在很久以前做……/P> 我已经完成了我的学生课程,但是现在我必须创建一个容器来存储n个学生。 我在考虑以下两种选择

1创建学生对象数组:学生数组学生[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也尝试过:创建指向每个学生的学生指针数组。 学生*ArrayOfStudents=学生[20]

我的问题是为什么方法1不起作用?在这种情况下,我必须使用指针吗?方法2的内容

因为我需要将这个数组传递到一个函数中,该函数将设置每个学生。我不知道会有多少学生。这是否意味着我必须向学生数组传递指针?在这种情况下,我真的希望方法1可以工作,我无法想象如何处理指向学生指针数组的指针。我在想,必须返回一个数据数组[numOfData][numOfStudnet],然后主要执行该操作,但无论哪种方式,我都想弄清楚这会给我带来错误的原因。。多谢各位

编辑:下面两个问题:我通过研究知道,我必须声明Student数组的大小作为参数,但是如果我只知道它运行后的大小会怎么样?在这种情况下,我的选项是什么?

您的学生类只有一个构造函数,即

Student(string myUID, string myLastName, string myFirstName,  
     string major, string age, string homeState, bool isWorking); 
因此,编译器不会生成默认构造函数。由于您也没有提供一个默认的ctor:one callable(无参数),编译器无法创建数组-它需要默认的可构造对象来放置在初始化数组的元素中

要修复此问题,您需要提供一个默认的ctor:

Student();
你需要根据学生的行为来了解自己的行为

您还可以为列出的Student-ctor的所有参数提供默认参数,这样就可以在不显式指定任何参数的情况下调用它,从而可以作为默认的ctor

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

另一种方法是创建指向学生的指针数组,这样您可以在动态创建指针时分配每个指针。在尝试访问指向的学生对象之前,必须测试元素是否为空指针

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之间(包括0和19)。注意,即使您有20个元素,当计数从0开始时,最大索引为19。您的学生类只有一个构造函数,即

Student(string myUID, string myLastName, string myFirstName,  
     string major, string age, string homeState, bool isWorking); 
因此,编译器不会生成默认构造函数。由于您也没有提供一个默认的ctor:one callable(无参数),编译器无法创建数组-它需要默认的可构造对象来放置在初始化数组的元素中

要修复此问题,您需要提供一个默认的ctor:

Student();
你需要根据学生的行为来了解自己的行为

您还可以为列出的Student-ctor的所有参数提供默认参数,这样就可以在不显式指定任何参数的情况下调用它,从而可以作为默认的ctor

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

另一种方法是创建指向学生的指针数组,这样您可以在动态创建指针时分配每个指针。在尝试访问指向的学生对象之前,必须测试元素是否为空指针

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之间(包括0和19)。注意,即使您有20个元素 当计数从0开始时,最大索引为19

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

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

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

您可以定义一个默认构造函数,允许使用数组,但是对于一个没有名字、年龄等的学生来说,这有意义吗

或者,使用Student*数组:

编辑:

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

// Get number of students somehow.
int numberOfStudents = ...;

// The '()' will set all pointers to NULL.
Student** arrayOfStudents = new Student*[numberOfStudents]();
请记住删除arrayOfStudents中的每个条目,并删除arrayOfStudents本身

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

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

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

您可以定义一个默认构造函数,允许使用数组,但是对于一个没有名字、年龄等的学生来说,这有意义吗

或者,使用Student*数组:

编辑:

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

// Get number of students somehow.
int numberOfStudents = ...;

// The '()' will set all pointers to NULL.
Student** arrayOfStudents = new Student*[numberOfStudents]();

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

我是否只创建一个空构造函数?那没什么用?或者建议我给它们一些值,比如null?不确定空ctor是什么意思。也不知道你想在哪里使用Null谢谢你非常详细的解释,但我的头仍然有点旋转。当我必须将指针传递到函数中时,指针的情况会变得更糟。我只是创建一个空构造函数吗?那没什么用?或者建议我给它们一些值,比如null?不确定空ctor是什么意思。也不知道你想在哪里使用Null谢谢你非常详细的解释,但我的头仍然有点旋转。当我必须将指针传递到函数中时,指针的情况变得更糟。需要调用默认构造函数来构造数组的每个元素。需要调用默认构造函数来构造数组的每个元素。但是函数的参数呢?我尝试使用global numberOfStudents,但我认为它不起作用,它似乎只需要常量。我必须编写一个函数,根据文本值设置学生。我在我的主目录中创建了这个学生数组,但是在我运行这个程序之前我不知道大小。因为这是家庭作业,我不想为你完整地写出来,这对你来说毫无意义。您需要将文本值转换为int,请参见std::ostringstream。将该int作为单个参数传递给create array函数,并让create array函数返回一个Student**。我已经编写了该函数,它是关于传递Student数组的。但如果我想不出来,我会问另一个问题。。。谢谢你,hmjd。但是函数的参数呢?我尝试使用global numberOfStudents,但我认为它不起作用,它似乎只需要常量。我必须编写一个函数,根据文本值设置学生。我在我的主目录中创建了这个学生数组,但是在我运行这个程序之前我不知道大小。因为这是家庭作业,我不想为你完整地写出来,这对你来说毫无意义。您需要将文本值转换为int,请参见std::ostringstream。将该int作为单个参数传递给create array函数,并让create array函数返回一个Student**。我已经编写了该函数,它是关于传递Student数组的。但如果我想不出来,我会问另一个问题。。。谢谢你,hmjd。