2

我有点困惑,对我来说,我认为以下两个实现是有效的(但我的语法有错误),但我无法让其中任何一个工作。这是一年级的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为参数,但是如果我只知道它运行后的大小怎么办?在这种情况下,我有什么选择?

4

2 回答 2

3

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

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

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

要修复,您需要提供一个默认 ctor:

Student();

您需要根据Student假定的行为方式找出自己的行为。

您还可以为列出的Studentctor 的所有参数提供默认参数,因此无需显式指定任何参数即可调用它——因此有资格作为默认 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 个元素,最大索引也是 19计数从 0 开始

于 2012-04-12T15:19:17.797 回答
2

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

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

Student arrayOfStudents[20];

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

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

于 2012-04-12T15:19:36.627 回答