我有一个 session 列表:
std::list<meeting*> meetings;
我想迭代列表并返回对特定 session 的引用:
meeting& day::findMeeting( float StartHour )
{
std::list<meeting*>::iterator it;
for(it = meetings.begin(); it != meetings.end(); it++)
{
if (it->getStartHour() == StartHour)
{
return *it;
}
}
throw no_such_meeting_error;
}
我收到以下错误:
-
'getStartHour' : is not a member of 'std::_List_iterator<_Mylist>'
-
'return' : cannot convert from 'meeting *' to 'meeting &'
-
invalid return type 'meeting **' for overloaded 'operator ->'
我仍在学习 C++,所以很乐意了解我做错了什么。还有,
- 从函数返回对对象的引用是好的做法吗?有更好的办法吗?
- 由于列表中的项目发生变化,引用是否可能在某些方面失效?
谢谢
最佳答案
I have a list of meetings.
不,你不知道。你有一个 session 指针列表。从那个误解中,你所有的进一步错误都会发生。
if (it->getStartHour() == StartHour)
如果您有 session 列表,此代码将是正确的。如果你有一个 session 指针列表,那是错误的。尝试:
if ((*it)->getStartHour() == StartHour)
下一步:
return *it;
尝试:
return **it;
或者,也许您真的想要一个“ session 列表”。在这种情况下,您可以这样声明您的列表:
std::list<meeting> meetings;
我不知道您想要哪一个 - session 列表或 session 指针列表。这与程序其余部分的设计有关。我几乎从不保留一个装满指针的容器。
您可能需要一个指针列表,例如,如果您需要多个列表条目来引用同一个 session 。 (“我在 10 点与 Abe 会面,11 点与 Bob 和 Chuck 会面,然后在 10 点与 Abe 再次会面”?)
如果复制 meeting
不可能或成本过高,您可能还需要一个指针列表。在这种情况下,我建议您使用 smart pointer而不是裸指针。
要回答您的其他问题,是的,返回对对象的引用是一件好事。您确实需要了解该对象的生命周期;永远不要在对象被销毁后通过其引用访问该对象。
关于c++ - 正确使用迭代器从列表中返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10604571/