2012-04-29 71 views
0

我有一个Student对象的数组。我将数组长度设置为100,但其中没有100个有效的Student对象。我希望能够遍历数组并获取所有有效的对象,然后在到达不具有Student对象的数组单元格时停止。在对象数组中找到最后使用的元素

我已经尝试将NULL放入最后一个学生后的数组单元格中,然后检查if (queriedStudents[i])以及if(queriedStudents[i] != NULL),但都没有为我工作。

什么是最好的方式来找到我的数组的使用部分的结束?

Student *Welcome::queryStudents(int *queries) { 
    int query = 0; 
    Student *matchedStudents[100]; 
    int matchedPos = 0; 
    while (queries[query] > 0) { 
     for (int i = 0; i < numStudents; i++) { 
      if (allStudents[i]->id == queries[query]) { 
       matchedStudents[matchedPos] = allStudents[i]; 
       matchedPos++; 
      } 
     } 

     query++; 
    } 
    matchedStudents[matchedPos] = NULL; 

    return *matchedStudents; 
} 

而且我的代码块试图打印出每个Student的价值观:

 int i = 0; 
     while (i < 100) { 
      if (queriedStudents[i]) { 
       cout << "ID:\t" << queriedStudents[i]->id << endl; 
       cout << "Name:\t" << queriedStudents[i]->name << endl; 
       cout << "Addr.:\t" << queriedStudents[i]->address << endl; 
       cout << "Phone:\t" << queriedStudents[i]->phone << endl; 
      } else { 
       i = 100; 
      } 
      i++; 
     } 
+5

如果可能,请使用'std :: vector'而不是数组 - 它会跟踪它包含的对象的数量。 – 2012-04-29 02:49:33

+2

如果数组包含指针,那么只要您在开始向其添加指针之前使用NULL初始化数组,就可以使用NULL描述的方式工作。这将使您不得不手动处理每个项目上的新/删除。正如Jerry所说,vector是避免这种情况的一个好选择,只存储您实际使用的内容。另一种方法是,如果无论出于何种原因都不能使用矢量,可能会将“有效”成员添加到您的Student对象,该对象默认初始化为false,并且只有在对象中存在实际数据时才设置为true。 – 2012-04-29 03:04:13

+1

@RetiredNinja:好评,更好的答案。发表它! – greg 2012-04-29 03:13:58

回答

3

你已经有了一个更大的问题。您可以在函数queryStudents的堆栈中声明数组matchedStudents。当控制超出该函数时,数组超出范围。如果你稍后尝试使用它(通过它返回的指针,它是数组的第一个元素),那么你正在搞乱释放内存,这几乎肯定会导致未定义的行为。就好像你正在访问一个自从你去年以来已经改变了所有者的房子;不知道发生了什么变化,如果你闭着眼睛徘徊,你可能会陷入困境。

可以声明堆上的数组:

Student **Welcome::queryStudents(int *queries) { 
    Student **matchedStudents = new *Student[100]; 
    ... 
    return matchedStudents; 
} 

或引用传递在:

void Welcome::queryStudents(int *queries, Student **&matchedStudents) { 
    ... 
} 

无论哪种方式,你就可以解决如何指示到底问题有效的指针。你的方法看起来可行,但请记住,正如@JerryCoffin指出的那样,std::vector可用。阵列是一种痛苦,而STL容器(例如vector)则是为你处理这些肮脏的细节而设计的。除了教学法之外,现在使用阵列几乎没有任何用处;与他们一起玩,直到你理解了这些概念,然后使用基于它们的更高级的容器。

+0

这几乎就是我所在的位置;这是我这学期上课的第一个任务,我最大的问题是从Java和AS3切换到C++。一旦我理解了这些概念,我就继续前进。 – 2012-04-29 04:21:25

相关问题