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

时间:2012-04-12 15:15:03

标签: c++ arrays class pointers

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

2 个答案:

答案 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