2014-01-10 2 views
0

Я хочу, чтобы сохранить список точки в результате отслеживания объекта в 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; 
    } 

ответ

0

Несколько ошибок. Сначала давайте рассмотрим проблему pos->center.

void OrganismPosition::setCenter(CvPoint2D32f* center){ 
    CvPoint2D32f newcenter=cvPoint2D32f(center->x,center->y); 
    // you've created a local 2f object that resides on the stack. 
    //this will be destroyed when the function returns. 
    this->center=&newcenter; 
    // what you're left with is a stack pointer to garbage data. 
} 

Что вы хотите, так это выделить память в куче.

void OrganismPosition::setCenter(const CvPoint2D32f* center){ 
    if (center) 
     delete center; // free memory that you used up before. 
    this->center= new cvPoint2D32f(center->x,center->y); 
} 

Теперь, зачем проходить всю эту головную боль в этом указателе? Просто используйте CvPoint2D32f членов в вашем классе OrganismPosition. Не создавайте указатели, если вам это не нужно.

+0

Спасибо, работа! Я использую этот код для точности: если (это-> центр) удалять это-> центр; это-> центр = новый CvPoint2D32f; это-> центр-> x = ctr-> x; this-> center-> y = ctr-> y; Можете ли вы объяснить, почему лучше не использовать указатель в классе memeber? – Simoyw

+0

Просто потому, что вам нужно добавить весь этот дополнительный код при использовании указателей. Вам нужно сделать это в каждом сеттере, вашем конструкторе копирования и операторе присваивания. Неспособность сделать это правильно может привести к мусорным данным, утечкам памяти и просто делает код уродливым. – Raja

+0

вам не нужно указывать 'this-> center' btw внутри функции-члена. 'центр' сделаю. – Raja

Смежные вопросы