【问题标题】:I created a List Container class in C++ and it's not working as expected我在 C++ 中创建了一个 List Container 类,但它没有按预期工作
【发布时间】:2016-08-07 00:01:47
【问题描述】:

所以首先我创建了一个结构来包含以下内容:

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_model 类的两个模型类实例,并将它们添加到我创建的 List 实例中:

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 类中的公共变量)

一切看起来都不错。 所以我有一个按键事件,我为模型的角度添加了一个值。

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

然后它再次打印值。

所以问题是当我按下键时,它的打印结果是一样的,就好像我没有添加值一样。

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

所以我的问题是为什么我使用 F3D_model 时它不起作用,我怎样才能让它起作用?

【问题讨论】:

  • 你能提供打印值的代码吗?“当你按下一个键时”是什么意思,这就像一个菜单吗?
  • @bkVnet 我所说的“当你按下一个键”的意思是我有一个 KeyPressed SFML 事件,每当我点击“空格”时都会添加到角度变量中
  • 好的,打印值时可能会出现问题。当我尝试您的代码时,添加值后它工作正常。此外,如果模型在屏幕上移动,您就知道这些值已添加。
  • @bkVnet 我用打印值的代码编辑了这个问题,你用什么类代替了 F3D_model?
  • 问题无法重现。也许您应该编辑问题中的代码以显示确切的执行顺序(何时打印信息,何时添加值),这可能会有所帮助。

标签: c++ list containers nodes class-template


【解决方案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&lt;int&gt;( GameEntities.getNode(1)-&gt;data.angle ),它应该可以工作。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 好吧,我没有使用model和model2,我从Node的数据中获取值。
    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2023-02-08
    • 2022-12-06
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多