我在 C++ 中创建了一个列表容器类,但它没有按预期工作

I created a List Container class in C++ and it's not working as expected

本文关键字:工作 容器类 列表 创建 C++ 一个 我在      更新时间:2023-10-16

因此,首先我创建了一个包含以下内容的结构:

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实例和一个Node指针:

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

然后,我创建F3D_modelClass的两个模型类实例,并将它们添加到我创建的List 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: %in",GameEntities.add(model));
printf("Created with ID: %in",GameEntities.add(model2));
printf("Model 1 Address: %pn",GameEntities.getNode(1));
printf("Model 2 Address: %pn",GameEntities.getNode(2));
printf("----------------n");
printf("Model 1 Data: %in",GameEntities.getNode(1)->data.angle);
printf("Model 2 Data: %in",GameEntities.getNode(2)->data.angle);
printf("----------------n");
printf("Tail ID: %in",(GameEntities.tail->id));
printf("Tail Data: %in",(GameEntities.tail->data.angle));
printf("Tail Address: %pn",(GameEntities.tail));
printf("----------------n");

(角度是F3D_model类中的公共变量)

一切看起来都很好。所以我有一个按键事件,我在其中为模型的角度添加一个值。

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

然后再次打印值。

所以问题是,当我按键时,它会打印出相同的值,就好像我没有添加值一样。

但当我按键时,它确实会在屏幕上移动模型,所以它实际上是在添加值。当我将类型从F3D_model更改为int并执行相同的过程时,它运行得很好。

所以我的问题是,当我使用F3D_型号时,为什么它不起作用,我该如何使它起作用?

根据您的描述,问题似乎只是如何打印角度:

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

您已经使用了%i,它是一个整数格式说明符。您已经说过,当您将angle的定义更改为int时,它会打印您所期望的内容。如果将格式字符串更改为%f以打印浮点值,或者打印static_cast<int>( GameEntities.getNode(1)->data.angle ),它应该可以工作。

我能想到的问题是,在打印值时使用model和model2,但应该使用节点,因为它们是创建的模型的副本。

您可以在列表中存储指向模型的指针,而不是模型本身,以避免复制模型。