指针问题(可能很简单)

时间:2015-11-14 16:33:19

标签: c++ pointers vector

这可能是非常基本的东西,但我似乎无法看到我搞砸了。

我有一个Cubes的向量(抽象类Node的子类),每个都包含一个包含其在平面上的位置的x和z位置的body对象。我试图将每个人都按照“跟随领导者”的方式移动,就像一个立方体的新位置是前任所在的样式。

由于我正在使用指针,这是我现在有点困惑的地方,它们都会到达相同的位置(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;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您将第一个立方体的位置指定给蛇位置,然后将每个后续立方体分配到此位置。

基本上每次迭代都是这样做的:

  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;

  ... 

您需要在分配之前暂时保存以前的位置,否则只需将所有内容分配给该位置。

答案 1 :(得分:0)

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

快速解决方法是从底部向上反向执行,以便在为元素分配新值时,我们知道不再需要旧值。这是使用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;
}