【问题标题】:Comparing two lists inside two separate objects比较两个单独对象中的两个列表
【发布时间】:2014-03-03 21:56:24
【问题描述】:

好的,经过几次不同的尝试,我一直在为这个问题而烦恼。为了提供一些背景知识并希望对这个问题有适当的了解,我将解释我的代码是如何设置的。

  • 我有一个指向 player_ 的指针列表,其中包含两个 HumanPlayer 类对象。
  • 每个 HumanPlayer 都包含一个 Snake_List 列表属性,这些列表的片段包含 x 和 y 数据。我想对照第二个 HumanPlayer 的 Snake_List 的 x 和 y 坐标的每一部分检查第一个 HumanPlayer 的 Snake_List 的 x 和 y 坐标的前面。

我当前的代码在应该执行此操作的函数中看起来有点像这样:

    for(Entity* player : entityList)
{
    Player* p = dynamic_cast<Player*>(player);
    Player* p2 = dynamic_cast<Player*>(player++);
    if(p)
    {
        i=p->Snake_List.begin();
        for(m=p2->Snake_List.begin(); m != p2->Snake_List.end(); m++)
        {
            if (i!=m)
            {
                if ((i->x == m->x) && i->y == m->y)
                {
                    p->respawn();
                    return;
                }
            }
        }
    }
}

这编译并运行良好,但碰撞并没有给我想要的效果。实际上什么也没发生。我真的认为我没有正确引用第二个 HumanPlayer 的列表,但如果有人可以帮助照亮它,我将不胜感激:)

【问题讨论】:

  • 您意识到pp2 具有相同的值吗?您为什么要无缘无故地使用晦涩的增量运算符来欺骗自己?
  • 你知道pp2 一开始都指向同一个玩家吗?
  • @KerrekSB 这是我的问题,我不知道如何指向列表中的第二个玩家
  • @JonathanPotter 这就是我遇到的问题,我实际上不知道指向列表中的下一个玩家。声明它的列表行(它在另一个链接文件中)看起来像这样 std::list player_ { new HumanPlayer( "Solid Snake"), new HumanPlayer ( "Liquid Ocelot")};我一直有这个问题,感谢您的回复,因为我不确定它是否指向同一件事,尽管我有疑问
  • 不要使用基于范围的 for 循环。

标签: c++ list class pointers comparison


【解决方案1】:

如果列表中只有两个 Player 对象(并且永远是),那么您可以像这样获得两个玩家:

auto itPlayer = entityList.begin();
Player* p1 = *(itPlayer++);
Player* p2 = *itPlayer;

这不会进行任何错误检查,因此如果列表中的玩家少于两个,它将崩溃。如果列表中可能有两个以上的玩家,则需要使用嵌套循环将每个玩家与其他玩家进行比较。

您的原始版本不起作用的原因(除了错误位置的后增量)是 range-based-for (for x : y) 返回列表中的实际对象,不是他们的迭代器。您需要迭代器来允许您递增以从列表中的一项移动到下一项,因为指针本身可能位于内存中的任何位置。

【讨论】:

  • 哦,哇,是的,使用自动是有意义的,因为正如你所说,只有两个玩家。我认为我也遇到了一些多态性问题,因为我必须更改最后两行以将我的 Entity* 动态转换为 Player*,但这已经奏效了。非常感谢,你迅速帮助我避免了另一次偏头痛。
【解决方案2】:

我认为主要问题在于您的代码 sn-p 的最顶部:

for(Entity* player : entityList)
{
    Player* p = dynamic_cast<Player*>(player);
    Player* p2 = dynamic_cast<Player*>(player++);

您迭代entryList,然后检查p 的头部是否碰到p2 的任何蛇片。但是,您必须在此处使用后自增运算符玩一些不寻常的技巧。

我认为你实际上想要做的是检查某个给定玩家的蛇头是否撞到了任何其他玩家的蛇。考虑到这个想法编写代码可能会避免使用后增量运算符,并且可以很好地扩展到更多玩家。

【讨论】:

  • 感谢替代设计方法。我想现在我已经完成了基本功能的工作,我将尝试像这样重写它以提高代码效率。
【解决方案3】:

你不想要'++player'吗?

对不起,我应该更冗长。我相信问题是您在

中使用播放器后对其进行索引

播放器* p2 = dynamic_cast(播放器++);

当你真正想要'++player'之类的东西时。 所以像

Player* p2 = dynamic_cast<Player*>(player) + 1;

所以你先投射到播放器,然后索引到下一个播放器。

【讨论】:

  • 我刚刚尝试过,但是当我这样做时,程序实际上并没有运行,而是崩溃了
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多