2016-04-15 49 views
0

所以首先它不工作我創建了一個結構包含以下內容:我在C++中創建一個列表容器類和預期

template <class T> 
struct ListNode 
{ 
    unsigned int id; 

    T data; 
    ListNode *next_left; 
    ListNode *next_right; 
}; 

並配有一流的下列內容:

template <class T> 
class List 
{ 

public: 

    unsigned int id_count; 
    ListNode<T> *tail; 

    List() 
    { 
     tail = NULL; 
     id_count = 0; 
    } 

    unsigned int add(T item) 
    { 
     id_count += 1; 

     ListNode<T> *n = new ListNode<T>; 
     n->id = id_count; 
     n->data = item; 
     n->next_left = tail; 
     n->next_right = NULL; 

     tail = n; 
     if (n->next_left != NULL) 
      n->next_left->next_right = n; 

     return id_count; 
    } 

    ListNode<T> *getNode(unsigned int id) 
    { 
     bool found = false; 
     ListNode<T> *np = tail; 
     while(np != NULL) 
     { 
      if (np->id == id) 
      { 
       found = true; 
       return np; 
       break; 
      } 
      else 
      { 
       np = np->next_left; 
      } 
     } 
     return NULL; 
    } 
}; 

這裏是一個鏈接到main.cpp的確切代碼:http://pastebin.com/fHhsvd9A

所以在我的main.cpp中創建一個List實例和一個節點指針:

List<F3D_model> GameEntities; 
ListNode<F3D_model> *np; 

然後,我創建了F3D_model類的兩個模型類實例並將它們添加到列表intsance我創建:

F3D_model model; 
model.create(); 

F3D_model model2; 
model2.create(); 

GameEntities.add(model); 
GameEntities.add(model2); 

打印模型的信息:

Created with ID: 1 
Created with ID: 2 

Model 1 Address: 07091F28 
Model 2 Address: 070919D0 

Model 1 Angle: 0 
Model 2 Angle: 0 

Tail ID: 2 
Tail Data: 0 
Tail Address: 070919D0 

代碼用來打印信息:

printf("Created with ID: %i\n",GameEntities.add(model)); 
printf("Created with ID: %i\n",GameEntities.add(model2)); 

printf("Model 1 Address: %p\n",GameEntities.getNode(1)); 
printf("Model 2 Address: %p\n",GameEntities.getNode(2)); 
printf("----------------\n"); 
printf("Model 1 Data: %i\n",GameEntities.getNode(1)->data.angle); 
printf("Model 2 Data: %i\n",GameEntities.getNode(2)->data.angle); 
printf("----------------\n"); 
printf("Tail ID: %i\n",(GameEntities.tail->id)); 
printf("Tail Data: %i\n",(GameEntities.tail->data.angle)); 
printf("Tail Address: %p\n",(GameEntities.tail)); 
printf("----------------\n"); 

(角度是F3D_model cl中的公共變量屁股)

一切看起來不錯。 所以我有一個按鍵事件,我爲模型的角度添加了一個值。

GameEntities.getNode(1)->data.angle += 60; 
GameEntities.getNode(2)->data.angle += 60; 

然後它再次打印值。

所以問題是,當我按下鍵時它打印相同,就好像我沒有添加值。

但是當我按下鍵時,它會在屏幕上移動模型,所以它實際上是添加了值。當我將F3D_model的類型更改爲int並執行相同的過程時,它工作得很好。

所以我的問題是爲什麼當我使用F3D_model時它不工作,我該如何使它工作?

+0

您能否提供打印值的代碼,以及「當您按下某個鍵時」的含義是什麼,就像菜單一樣? –

+0

@bkVnet我的意思是「當你按下一個鍵」時,我有一個KeyPressed SFML事件,只要我點擊「空格」就會增加角度變量。 – Fergarram

+0

好吧,打印這些值時可能會出現問題。當我嘗試你的代碼後,它添加的值後工作正常。除此之外,如果模型在屏幕上移動,則知道這些值會被添加。 –

回答

1

從你所描述的東西,它聽起來就像是問題是你是如何印刷的角度:

printf("Model 1 Data: %i\n",GameEntities.getNode(1)->data.angle); 
printf("Model 2 Data: %i\n",GameEntities.getNode(2)->data.angle); 

您已經使用%i是一個整數格式說明。您已經說過,當您將angle的定義更改爲int時,它會顯示您期望的內容。如果將格式字符串更改爲%f以打印浮點數,或者打印static_cast<int>(GameEntities.getNode(1)->data.angle),它應該可以工作。

+0

是的,這是問題,謝謝。 – Fergarram

0

我能想到的問題是在打印值時使用model和model2,但應該使用節點,因爲它們是創建模型的副本。

您可以在模型中存儲指向模型的指針而不是模型本身,以避免複製模型。

+0

那麼,我沒有使用model和model2,我從Node的數據中獲取了值。 – Fergarram