2016-04-15 7 views
0

erwartet Also zuerst habe ich eine Struktur folgendes enthalten:habe ich eine Liste Container-Klasse in C++ und es funktioniert nicht wie

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

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

Und eine Klasse mit den folgenden:

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

Hier ist ein Link zu dem genauen Code von main.cpp:

012.351: http://pastebin.com/fHhsvd9A

Also in meinem main.cpp ich eine List-Instanz und einen Knoten Zeiger erstellen

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

Dann erstelle ich zwei Modellklasse Instanzen der F3D_model Klasse und fügen Sie sie in die Liste intsance ich erstellt:

F3D_model model; 
model.create(); 

F3D_model model2; 
model2.create(); 

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

Drucken Modelle Informationen:

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 

-Code verwendet, um Informationen zu drucken :

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"); 

(Winkel ist eine öffentliche Variable in F3D_model cl ass)

Alles sieht gut aus. So habe ich ein Tastendruckereignis, wo ich einen Wert zu den Winkeln der Modelle hinzufüge.

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

und dann druckt es erneut die Werte.

Also das Problem ist, dass, wenn ich die Taste drücke es druckt das gleiche, als ob ich nicht die Werte hinzugefügt hatte.

ABER wenn ich die Taste drücke, bewegt es das Modell auf dem Bildschirm, so dass es tatsächlich die Werte hinzufügt. Und wenn ich den Typ von F3D_model zu int ändere und den gleichen Prozess mache, funktioniert es gut.

SO meine Frage ist, warum funktioniert es nicht, wenn ich das F3D_model verwende, und wie kann ich es machen?

+0

Können Sie den Code bereitstellen, der die Werte ausgibt und was meinen Sie "wenn Sie eine Taste drücken", ist das wie ein Menü? –

+0

@bkVnet was ich meine mit "wenn Sie eine Taste drücken" ist, dass ich ein KeyPressed SFML-Ereignis habe, das die Winkelvariable fügt, wenn ich "Leerzeichen" treffe – Fergarram

+0

Ok, könnte es ein Problem sein, wenn Sie die Werte drucken. Wenn ich Ihren Code ausprobiert habe, funktioniert es nach dem Hinzufügen der Werte. Wenn sich das Modell auf dem Bildschirm bewegt, wissen Sie, dass die Werte hinzugefügt wurden. –

Antwort

1

Von dem, was Sie beschrieben haben, es klingt wie das Problem nur ist, wie Sie den Winkel sind Druck:

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

Sie %i verwendet haben, die eine ganze Zahl Formatbezeichner ist. Sie haben gesagt, es druckt, was Sie erwarten, wenn Sie die Definition von angle zu einem int ändern. Wenn Sie die Formatzeichenfolge in %f ändern, um ein Float zu drucken, oder static_cast<int>(GameEntities.getNode(1)->data.angle) drucken, sollte es funktionieren.

+0

Ja das war das Problem, danke. – Fergarram

0

Das Problem, das ich denken kann, ist, dass Sie Modell und Modell2 beim Drucken von Werten verwenden, aber Sie sollten stattdessen Ihre Knoten verwenden, weil sie Kopien der erstellten Modelle sind.

Sie können Zeiger auf Modelle statt auf Modelle selbst in Ihrer Liste speichern, um das Kopieren von Modellen zu vermeiden.

+0

Nun, ich habe nicht Modell und Model2 verwendet, ich bekomme die Werte aus den Daten des Knotens. – Fergarram