0

我创建了两个班级,班级和学生。在 Class 构造函数中,我需要动态初始化一个指向 Student 对象的指针数组(pStudents)(我不能使用向量),初始化为 null。当我使用函数 addStudent 将学生添加到班级时,我希望能够在指针数组中搜索第一个空地址,然后将学生分配到数组中的那个位置。如果学生已经在课堂上,我还希望能够搜索数组以查看该学生是否已经在那里。

当我尝试编译程序时,出现分段错误。我知道这与我在创建 pStudents 数组时使用堆内存的方式有关,但我不确定如何解决这个问题。

这是我在 Class 头文件中声明数组的方式:

Student **ptrStudents;

这是 Class 对象的构造函数。现在,我使用任意大小的 40 作为数组。

Class::Class()
{
Student **ptrStudents = new Student*[40];
}

这是函数 addStudents,它接受一个指向学生对象的指针作为其参数。请注意,字符串名称是所有学生的数据字段。

Class::addStudents(Student *student)
{

 string name = student -> getName();
 string nameTemp;

 for (int i = 0; i < 40; i++)
 {
    if (ptrStudents[i] != 0)
    {
       nameTemp = ptrStudents[i] -> getName();  
       if (name == nameTemp)
       {
         cout << "This student is already in the class." << endl;
         return;
        }
    }

else if (ptrStudents[i] == 0)
{
        ptrStudents[i] = student;
        return;
}

这是我正在使用的主要功能:

int main ()
{
    Class Economics;
    Student student1("Hannah");
    Economics.addStudent(&student1);

    return 0;
}
4

4 回答 4

0

您需要将数组中的每个指针初始化为 NULL。将您的构造函数更改为:

Class::Class()
{
ptrStudents = new Student*[40];
for(int i = 0; i < 40; i++)
    ptrStudents[i] = 0;    //NULL
}

创建指针时,它不会自动初始化为 NULL。所以发生的事情是你有一堆指向垃圾数据的随机指针,当你到达这条线时

if (ptrStudents[i] != 0)

它们都通过了,因为它们不是 NULL,即使它们不可用。

哎呀,我错过了一个大的,即使我复制了你的代码(谢谢你,约翰)。您不应该重新声明 ptrStudents 数组;在构造函数中创建一个本地数组,而不是初始化成员数组。

于 2013-04-06T18:46:57.567 回答
0

类头中声明的数组永远不会被初始化。

Student **ptrStudents = new Student*[40];

这声明了一个局部变量并使用新数组对其进行初始化。

将其更改为:

ptrStudents = new Student*[40];

于 2013-04-06T18:50:15.733 回答
0

至少两个错误

首先,您应该将数组值初始化为 NULL(正如 Parker Kemp 所说)

其次,您在构造函数中声明了一个名为 ptrStudents 的局部变量,它隐藏了也称为 ptrStudents 的类变量。您应该删除该声明。所以像这样

Class::Class()
{
    ptrStudents = new Student*[40];
    for(int i = 0; i < 40; i++)
        ptrStudents[i] = 0;
}
于 2013-04-06T18:50:52.733 回答
0

根据您显示的内容猜测

Class::Class()
{
    Student **ptrStudents = new Student*[40];
}

声明一个新的Student **ptrStudents. 要初始化成员ptrStudents,您不必声明它。它已经被声明了。

你想要的是

Class::Class()
{
    ptrStudents = new Student*[40];
}
于 2013-04-06T18:52:11.607 回答