элементы списка заменяются, а не вставляются

В настоящее время я работаю над проектом Kinect в C ++. Я работаю под 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_back а также insert,
Я также пробовал тот же код в Windows с VS2010, где он работал нормально.
Я понятия не имею, что я делаю не так.

Так что было бы здорово, если бы кто-то мог мне помочь. 🙂

0

Решение

Я вижу пару проблем.

Когда вы добавляете указатель на переменную стека в список рук. Как только рука выходит из области видимости, у вас есть свисающий указатель.

Во-вторых, ваш handlist.Get возвращается (предположительно) копией, и, следовательно, все, что вы добавляете в него, не отражается в версии, которую занимает handlist. То есть: Вы можете вызвать handlist.Get (), добавить 500 баллов, затем вызвать handlist.Get еще раз, и это будет оригинальная версия.

Ваша функция handlist.Get () также не возвращает указатель, но вы передаете указатель handlist.Add (), поэтому ваш интерфейс не ясен.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]