列表元素被替换而不是插入

时间:2013-01-28 16:46:49

标签: c++ list vector kinect openni

我目前正在使用C ++开发一个kinect项目。我在Ubuntu 12.04(32位)下工作,我使用OpenNI / NITE。 我想找到一只手并将其坐标保存在列表中,对于这部分,我有以下代码:

部首:

#ifndef HAND_H_
#define HAND_H_
#include <list>
#include<iostream>
#include <stdio.h>

class Hand
{
public:
    std::list<double> Xpoints;
    std::list<double> Ypoints;
    std::list<double> Zpoints;
    Hand(int id);
    int handID;
    void AddPoint(double x, double y, double z);
    void ClearList(void);
    void ReleaseHand(void);
    int GetID(void);
    int Size();
};
#endif

CPP:

#include "Hand.h"

Hand::Hand(int id)
{
    handID = id;
}


void Hand::AddPoint(double x, double y, double z)
{
    ("Hand ID: %d: (%f,%f,%f)\n", handID, x, y, z);
    if(handID > 0)
    {
        Xpoints.push_back(x);
        Ypoints.push_back(y);
        Zpoints.push_back(z);
        ("Added to Hand ID: %d: (%f,%f,%f)\n", handID, x, y, z);
    }
    else
    {
        std::cout << "Hand does not exist anymore - Inconsistency!" << std::endl;
    }
}


void Hand::ClearList(void)
{
    Xpoints.clear();
    Ypoints.clear();
    Zpoints.clear();
}

void Hand::ReleaseHand(void)
{
    handID = -1; // if (ID==-1) no valid hand
    Xpoints.clear();
    Ypoints.clear();
    Zpoints.clear();
}

int Hand::GetID(void)

{
    return handID;
}

int Hand::Size()
{
    return Xpoints.size();
}

此处AddPoints()被调用:

Hand hand(cxt->nID);
hand.AddPoint(cxt->ptPosition.X, cxt->ptPosition.Y, cxt->ptPosition.Z);
handlist.Add(&hand);

它工作正常。 后来,当我从我的kinect得到一个新手的坐标时,我称之为:

Hand tmp = handlist.Get(cxt->nID);
tmp.AddPoint(cxt->ptPosition.X, cxt->ptPosition.Y, cxt->ptPosition.Z);
std::cout << "Hand size " << tmp.Size() << std::endl;

这里,当第一次将第二组坐标添加到我手中的列表时调用它。但在此之后,列表不能超过大小2.这意味着不是插入,而是替换最后的点。 (我已打印出来,所以我可以看到坐标) 我还尝试了push_front替换前面的坐标,以及向量而不是push_backinsert具有相同问题的列表。 我也在Windows中使用VS2010尝试了相同的代码,它运行良好。 我完全不知道我做错了什么。

如果有人能帮助我,那就太好了。 :)

1 个答案:

答案 0 :(得分:2)

我看到了几个问题。

您可以将指向堆栈变量的指针添加到手册列表中。一旦手离开范围,你就会有一个悬垂的指针。

其次,你的handlist.Get正在返回(大概)复制,因此你添加到它的任何内容都不会反映在handlist占用的版本中。即:您可以调用handlist.Get(),添加500点,然后调用handlist.Get再次,它将是原始版本。

你的handlist.Get()函数也没有返回指针,但是你传递了handlist.Add()一个指针,所以你的界面不清楚。