正确使用迭代器从列表中返回一个对象

Mic*_*ael 2 c++

我有一份会议清单:

std::list<meeting*> meetings;
Run Code Online (Sandbox Code Playgroud)

我想迭代列表并返回对特定会议的引用:

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;
}  
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

  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 ++,所以很高兴能够理解我做错了什么.也,

  • 从函数返回对象的引用是一种好习惯吗?还有更好的事吗?
  • 由于列表中项目的更改,引用是否可能在某些引用上失效?

谢谢

Rob*_*obᵩ 13

我有一份会议清单.

不,你没有.你有一个会议指针列表.从那一个误解,你所有的进一步错误流动.

if (it->getStartHour() == StartHour)
Run Code Online (Sandbox Code Playgroud)

如果您有会议列表,此代码将是正确的.如果你有一个会议指针列表是错误的.尝试:

if ((*it)->getStartHour() == StartHour)
Run Code Online (Sandbox Code Playgroud)

下一个:

return *it;
Run Code Online (Sandbox Code Playgroud)

尝试:

return **it;
Run Code Online (Sandbox Code Playgroud)


或者,也许你真的想要一个"会议清单".在这种情况下,您将声明您的列表:

std::list<meeting> meetings;
Run Code Online (Sandbox Code Playgroud)

我不知道你想要哪一个 - 会议列表或会议指针列表.这与您计划的其余部分的设计有关.我几乎从不保持一个装满指针的容器.

您可能需要一个指针列表,例如,如果您需要多个列表条目来引用同一个会议.("我和Abe在10点开会,与Bob和Chuck在11点开会,然后在10点与Abe再次会面"?)

如果复制a meeting不可能或过于昂贵,您也可能需要一个指针列表.在这种情况下,我建议你使用智能指针而不是裸指针.

要回答你的另一个问题,是的,返回对象的引用是件好事.您需要了解该对象的生命周期; 在销毁之后永远不会通过引用访问对象.


Mar*_*1ni 6

它是指向对象会议的指针,你必须返回它.返回引用很好,但请注意稍后使用它做什么.指针的工作方式是,如果编辑引用,列表中的项也将被更改,反之亦然.