Я хочу, чтобы сохранить список точки в результате отслеживания объекта в OpenCVСписок указателей C++ OpenCV attrubuts изменить unexpectly
Я использую этот список
list<list<OrganismPosition*>> trackList;
Я вставить список и ванной элемента:
list<OrganismPosition*> sublist;
trackList.push_back(sublist);
list<list<OrganismPosition*>>::iterator itList=trackList.end();
itList--;
OrganismPosition* pos=new OrganismPosition();
//in this method I create a new point
pos->setCenter(&box.center);//Here the point pos->center is (640,550)
itList->push_front(pos);//Error here the point pos->center has value (-103412,-102342)
Ошибка в том, что при добавлении объекта в список значение атрибута «центр» изменяется со случайным значением. В чем может быть проблема и как это решить? Я прочитал, что список вызывает экземпляр-конструктор класса, поэтому я внедрил это, чтобы скопировать правильное значение атрибутов, но все еще не работает. Я очень ценю любую помощь. Благодаря
Мой класс OrganismPosition:
class OrganismPosition
{
CvPoint2D32f* center;//center point of organisme tracked
CvPoint2D32f* head;//head point of organisme tracked
CvPoint2D32f* queue;//first point of organisme tracked
CvPoint2D32f* skel1;//second point of organisme tracked
CvPoint2D32f* skel2;//third point of organisme tracked
CvPoint2D32f* skel3;//fourth point of organisme tracked
CvPoint2D32f* skel4;//fiveth point of organisme tracked
public:
OrganismPosition(void);
~OrganismPosition(void);
OrganismPosition(const OrganismPosition& other);
void setCenter(CvPoint2D32f* center);
CvPoint2D32f* getCenter();
void setHead(CvPoint2D32f* head);
CvPoint2D32f* getHead();
void setQueue(CvPoint2D32f* queue);
CvPoint2D32f* getQueue();
void setSkel(CvPoint2D32f* skel1,
CvPoint2D32f* skel2,
CvPoint2D32f* skel3,
CvPoint2D32f* skel4);
void getSkel(CvPoint2D32f* skel1,
CvPoint2D32f* skel2,
CvPoint2D32f* skel3,
CvPoint2D32f* skel4);
};
Класс OrganismPosition.cpp:
OrganismPosition::OrganismPosition(void)
{
}
OrganismPosition::~OrganismPosition(void)
{
}
OrganismPosition::OrganismPosition(const OrganismPosition& other)
{
OrganismPosition::center->x=other.center->x;
OrganismPosition::center->y=other.center->y;
OrganismPosition::head->x=other.head->x;
OrganismPosition::head->y=other.head->y;
}
void OrganismPosition::setCenter(CvPoint2D32f* center){
CvPoint2D32f newcenter=cvPoint2D32f(center->x,center->y);
this->center=&newcenter;
}
CvPoint2D32f* OrganismPosition::getCenter(){
return this->center;
}
void OrganismPosition::setHead(CvPoint2D32f* head){
CvPoint2D32f newhead=cvPoint2D32f(head->x,head->y);
this->head=&newhead;
}
CvPoint2D32f* OrganismPosition::getHead(){
return this->head;
}
void OrganismPosition::setQueue(CvPoint2D32f* queue){
CvPoint2D32f newqueue=cvPoint2D32f(queue->x,queue->y);
this->queue=&newqueue;
}
CvPoint2D32f* OrganismPosition::getQueue(){
return this->queue;
}
void OrganismPosition::setSkel(CvPoint2D32f* skel1,
CvPoint2D32f* skel2,
CvPoint2D32f* skel3,
CvPoint2D32f* skel4){
CvPoint2D32f newskel1=cvPoint2D32f(skel1->x,skel1->y);
this->skel1=&newskel1;
CvPoint2D32f newskel2=cvPoint2D32f(skel2->x,skel2->y);
this->skel2=&newskel2;
CvPoint2D32f newskel3=cvPoint2D32f(skel3->x,skel3->y);
this->skel3=&newskel3;
CvPoint2D32f newskel4=cvPoint2D32f(skel4->x,skel4->y);
this->skel4=&newskel4;
}
void OrganismPosition::getSkel(CvPoint2D32f* skel1,
CvPoint2D32f* skel2,
CvPoint2D32f* skel3,
CvPoint2D32f* skel4){
skel1=this->skel1;
skel2=this->skel2;
skel3=this->skel3;
skel4=this->skel4;
}
Спасибо, работа! Я использую этот код для точности: если (это-> центр) удалять это-> центр; это-> центр = новый CvPoint2D32f; это-> центр-> x = ctr-> x; this-> center-> y = ctr-> y; Можете ли вы объяснить, почему лучше не использовать указатель в классе memeber? – Simoyw
Просто потому, что вам нужно добавить весь этот дополнительный код при использовании указателей. Вам нужно сделать это в каждом сеттере, вашем конструкторе копирования и операторе присваивания. Неспособность сделать это правильно может привести к мусорным данным, утечкам памяти и просто делает код уродливым. – Raja
вам не нужно указывать 'this-> center' btw внутри функции-члена. 'центр' сделаю. – Raja