指针问题(可能很容易)

Pointer Issues (Probably Easy)

本文关键字:很容易 问题 指针      更新时间:2023-10-16

这可能是非常基本的东西,但我似乎看不出我在哪里搞砸了。

我得到了一个立方体向量(抽象类Node的子类),每个立方体都包含一个身体对象,该对象包含其在平面上位置的x和z位置。我试图以"追随领导者"的风格移动每一个立方体,立方体的新位置是前任的位置。

由于我使用的是指针,这是我现在有点困惑的地方,因为它们都指向同一个位置(无论snake.x和snake.z在哪里),所以我知道它们都指向相同的数据。

想知道我需要修改什么,以便每个都能反映正确的坐标。

 void updateChildren()
{
    Node * prevPiece;
    typedef std::vector<Node*>::iterator It;
    for(It curNode=nodes.begin(); curNode!=nodes.end(); ++curNode)
    {
        if (curNode == nodes.begin())
        {
            prevPiece = *curNode;
            dynamic_cast<Cube*>(*curNode)->body.xPos = snake.xPos;
            dynamic_cast<Cube*>(*curNode)->body.zPos = snake.zPos;
        }
        else
        {
            Node * tmp = *curNode;
            dynamic_cast<Cube*>(*curNode)->body.xPos = dynamic_cast<Cube*>(prevPiece)->body.xPos;
            dynamic_cast<Cube*>(*curNode)->body.zPos = dynamic_cast<Cube*>(prevPiece)->body.zPos;
            prevPiece = tmp;
        }
    }
}

您将第一个多维数据集的位置分配给snake位置,然后随后的每个多维数据集都被分配给这个位置。

基本上,你正在做的每一次迭代:

  current.position = previous.position. 
  previous = current;  // The "previous position" has been overwritten
  ... next iterationn ...
  current.position = previous.position; // previous.position is the new vlaue
  previous = current;
  ... 

在分配之前,您需要临时保存上一个位置,否则所有内容都会分配给该位置。

您正在修改头,然后将任何后续元素设置为与头相同的值。

一个快速的解决方案是以相反的方式从下到上进行,这样当一个元素被赋予一个新值时,我们就知道不再需要它的旧值了。这是使用reverse_iterator s:实现的

void updateChildren()
{
    for(auto curNode = nodes.rbegin(); curNode!=nodes.rend()-1; ++curNode)
    {
        dynamic_cast<Cube*>(*curNode)->body.xPos = dynamic_cast<Cube*>(*(curNode+1))->body.xPos;
        dynamic_cast<Cube*>(*curNode)->body.zPos = dynamic_cast<Cube*>(*(curNode+1))->body.zPos;
    }
    dynamic_cast<Cube*>(nodes.front())->body.xPos = snake.xPos;
    dynamic_cast<Cube*>(nodes.front())->body.zPos = snake.zPos;
}