2015-11-14 33 views
0

這可能是一個非常基本的東西,但我似乎無法看到我搞亂了什麼。指針問題(可能很容易)

我有一個Cubes(抽象類Node的子類)的向量,每個Cubes都擁有一個包含其在飛機上的位置的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; 
     } 
    } 
} 
+0

我不知道如果是這樣的問題,但如果對象是錯誤的類型(在這種情況下不是一個立方)的dynamic_cast的可以返回一個'nullptr'。這應該總是被檢查。 – Arne

+0

這只是一個交換問題。 – erip

+0

您將每個位置設置爲前一個位置,但是隻有在更新之前的位置到位於其前面的位置之後。如果按相反順序(rbegin,rend)執行此操作,它將按照從尚未訪問的節點讀取的方式工作。您也可以改爲存儲前一個節點的位置而不是節點指針,然後再修改它。 – dascandy

回答

0

您正在修改頭部,然後將任何後續元素設置爲頭部的相同值。

快速解決方法是從底部開始以相反的方式進行,以便爲元素分配新值時,我們知道不再需要舊值。這是使用reverse_iterator小號來實現:

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; 
} 
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; 

    ... 

你需要,否則分配給它一切都只是被髮送到一個前臨時保存先前的位置。

+0

不完全。在else的結尾,它變成當前節點。它只是爲第一個元素騰出空間。 –

+0

@DiegoSevilla是的,但是即使他的指針是'前一個'是正確的 - 位置已經被修改了,所以「前一個位置」不再存在。 –

+0

我該如何防止這種情況呢?我的指針技巧是有點弱,所以想知道我在哪裏修改位置再次 – Psychosupreme