我感到有点困惑,对我来说,我认为以下两个实现是有效的(但我的语法有错误),但我不能让其中任何一个工作。这是一年级的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]
的数组,并在主要部分进行,但无论如何我想弄清楚为什么这会给我错误..谢谢。
编辑:提问:我知道通过研究,我必须声明Student
数组的大小作为参数,但如果我只知道它后面的大小怎么办?运行?在那种情况下,我的选择是什么?
答案 0 :(得分:2)
您的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
对象之前,您必须测试该元素是否为空指针。
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个元素,最大的索引计数从0开始是19
答案 1 :(得分:2)
我的问题是为什么方法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
。