当我尝试创建对象数组时出错
Error when I try to create array of object
我有点困惑,对我来说,我认为以下两个实现是有效的(但我的语法有错误),但我无法让其中任何一个工作。这是一年级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
本身。
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 将链表转换为指针数组时出错
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 基于数组的列表 - 动态数组创建时出错
- 从斐波那契序列 c++ 中的数组中查找正确的元素时出错
- 分段 使用 MPI_Gather 收集字符数组时出错
- 读取字符串字符时出错 - 对于数组中的字符串值
- 声明数组>> int arr[] 时出错;在C++(虽然在 Java 中有效)?
- 在 c++ 中返回一维数组时出错
- 将 2D 数组传递给 C++ 中的函数时出错
- 在 c++ 上创建动态数组时出错
- 尝试返回指向 Visual Studio 中的动态数组的指针时出错C++
- 将 find_if() 与数组一起使用的代码段中出错
- 在比较特定输入中的程序的数组中出错
- 分段 填充数组时出错
- 数组作为函数参数查找数组长度时出错
- C++:用户定义的类型数组出错
- C++中的数组出错
- 我正在创建精灵数组出错
- 在将代码从Windows移植到Linux时删除数组出错