c++ - 正确使用迭代器从列表中返回对象

标签 c++

我有一个 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;
}  

我收到以下错误:

  1. 'getStartHour' : is not a member of 'std::_List_iterator<_Mylist>'
  2. 'return' : cannot convert from 'meeting *' to 'meeting &'
  3. 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/

相关文章:

c++ - make_pair 和 push_back 基指针并实例化一个基指针 vector

c++ - C++ 中的俄罗斯方 block 对象模型

使用opencv进行c++视频捕获

c++ - LPWSTR 到 wstring c++

c++ - 创建 Visual Studio 属性表以简化 C++ 库的使用

c++ - push_back 派生类

c++ - 通过构造函数传递对象?

c++ - 在类方法上使用 std::apply

c++ - 从输入文件读取复合键和数值的正确方法是什么?

c++ - 消息窗口 C++ Win32 类/示例