2011-02-09 2 views
1

У меня есть этот код: std :: vector не сохраняя данные?


void BaseOBJ::update(BaseOBJ* surround[3][3]) 
{ 
    forces[0]->Apply(); //in place of for loop 
    cout << forces[0]->GetStrength() << endl; //forces is an std::vector of Force* 
}

void BaseOBJ::AddForce(float str, int newdir, int lifet, float lifelength) {

Force newforce; 
newforce.Init(draw, str, newdir, lifet, lifelength); 
forces.insert(forces.end(), &newforce); 
cout << forces[0]->GetStrength(); 

}

Теперь, когда я называю AddForce и сделать бесконечную силу с силой одной стороны, это соиЬ-х 1. Но когда обновление называется, он просто выводит 0 , как будто силы больше не было.

ответ

4

Вы сохраняете указатель силы в своем векторе, но сила является локальной.

Вы должны использовать new для создания в куче.

Force* f = new Force; 
forces.push_back(f); 
+0

Спасибо, работал как шарм! +1 – Chris

+2

+1 И не забудьте вызвать delete для каждого элемента вектора при выходе. –

+1

@Chris: Не забудьте вызвать 'delete'. Еще лучше - используйте 'boost :: ptr_vector' (http://www.boost.org/doc/libs/1_45_0/libs/ptr_container/doc/ptr_vector.html) –

3

Вы должны создать группу с новым:

Force *newforce = new Force; 
newforce->Init(draw, str, newdir, lifet, lifelength); 
forces.insert(forces.end(), newforce); // or: forces.push_back(force); 

Что происходит с вашим кодом, что ваш объект остается в стеке, после выхода из функции и сделать что-то другое, он получает перезаписаны ,

Почему вектор указателей? Возможно, вам нужен вектор Force, а не Force *. Вам также придется удалить все элементы вашего вектора, прежде чем выбросить его!

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