2016-04-15 28 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