在对象数组中找到最后使用的元素
我有一个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++;
}
你已经有了一个更大的问题。您可以在函数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
)则是为你处理这些肮脏的细节而设计的。除了教学法之外,现在使用阵列几乎没有任何用处;与他们一起玩,直到你理解了这些概念,然后使用基于它们的更高级的容器。
这几乎就是我所在的位置;这是我这学期上课的第一个任务,我最大的问题是从Java和AS3切换到C++。一旦我理解了这些概念,我就继续前进。 – 2012-04-29 04:21:25
如果可能,请使用'std :: vector'而不是数组 - 它会跟踪它包含的对象的数量。 – 2012-04-29 02:49:33
如果数组包含指针,那么只要您在开始向其添加指针之前使用NULL初始化数组,就可以使用NULL描述的方式工作。这将使您不得不手动处理每个项目上的新/删除。正如Jerry所说,vector是避免这种情况的一个好选择,只存储您实际使用的内容。另一种方法是,如果无论出于何种原因都不能使用矢量,可能会将“有效”成员添加到您的Student对象,该对象默认初始化为false,并且只有在对象中存在实际数据时才设置为true。 – 2012-04-29 03:04:13
@RetiredNinja:好评,更好的答案。发表它! – greg 2012-04-29 03:13:58