【问题标题】:stl list iterator of objects pointerstl 对象指针的列表迭代器
【发布时间】:2012-07-02 00:43:25
【问题描述】:

我读过一些关于这个主题的帖子,但我不知道,使用对象指针的 stl 列表,当我想通过迭代器访问元素函数时,应用程序会得到空指针的错误运行时间。有人会帮我吗?我很感激任何帮助。提前致谢。 这是代码的一部分:

  typedef std::list<Actor> listActors;
  listActors listactors = pMain->Actors();
  listActors::iterator iter = listactors.begin();

std::string nameactor;
nameactor = (*iter)->getName();//Here the app get a run time error of null pointer

【问题讨论】:

  • 这完全取决于该列表的填充方式。你还没有向我们展示代码。但我的猜测是第一个元素是一个空指针......
  • 您将 Actor 对象存储在列表中,而不是指向 Actor 对象的指针。也就是说,您不能在元素上应用 -> 运算符,因此这应该会引发编译错误。您的代码执行以下操作:Actor a; a-&gt;getName(); 正确的是:Actor a; a.getName();
  • @DavidFrank:使用如图所示的代码,您是正确的。另一种可能性是 LarriPapi 只是没有显示正确的代码,并且该列表确实是一个指针列表。由于我们都只是在这里猜测,我的猜测是列表为空(begin() == end()),在这种情况下,iter 的取消引用无效。
  • 另一种不太可能的可能性是 Actor 重载了 -> 运算符。
  • 投票结束,因为 OP 没有提供足够的信息来使其成为一个真正的问题。

标签: c++ stl iterator


【解决方案1】:

不要投票这不是答案。但是对于评论部分来说太长了。
当问题得到适当更新时,我将删除。

这个:

typedef std::list<Actor> listActors;

表示您的列表中充满了 Actor 的对象而不是指向 Actor 的指针。

如果这样:

nameactor = (*iter)->getName();

编译,则 (*iter) 是一个 Actor 对象,您可以在其上使用 -> 的唯一方法是该类重载 operator-&gt;() 并返回一个为 NULL 的指针。

由于我们没有 Actor 的代码,我们无法告诉您出了什么问题,或者更有可能您在创建问题时犯了剪切粘贴错误。在这种情况下,我们也无能为力。

您需要编写我们可以编译和运行的代码来复制问题。他们将确切的代码粘贴到问题中。

【讨论】:

    【解决方案2】:

    (*iter)-&gt;getName(); 是错误的。 你应该写iter-&gt;getName();(*iter).getName();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多