Autodestrukcja obiektu, a jego miejsce w vectorze
Ostatnio zmodyfikowano 2014-02-21 23:20
Krzyko Temat założony przez niniejszego użytkownika |
Autodestrukcja obiektu, a jego miejsce w vectorze » 2014-02-21 22:24:11 Stworzyłem klasę, która po podanym czasie sama się usuwa. Problem w tym, że te niszczące się obiekty mam w vectorze. Kompilator wywala crash po tym jak trafi na martwy obiekt. No i teraz mam problem, bo jak sprawić żeby po "delete this;" usuwało obiekt również z kontenera w którym się znajduje? #include <iostream> #include <vector> #include <SFML/Graphics.hpp> using namespace std;
class Anim { sf::Clock time; public: Anim( float czas ) { this->czas = czas; time.restart(); } void make() { cout << "Jestem "; if( time.getElapsedTime().asSeconds() > czas ) { delete this; cout << "usuniety"; } cout << endl; } float czas; };
vector < Anim > ANIM; void Add( float czas ) { ANIM.push_back( Anim( czas ) ); } int main() { float ile; do { cout << "__________________________________\n"; cin >> ile; if( ile > 0 ) { Add( ile ); } for( int i = 0; i < ANIM.size(); i++ ) { ANIM[ i ].make(); } ile = 0; } while( true ); return 0; } |
|
pekfos |
» 2014-02-21 22:45:14 żeby po "delete this;" usuwało obiekt również z kontenera w którym się znajduje? |
Nie da się. Poza tym, nie robi się czegoś takiego, jak delete this. Oznacz obiekty do usunięcia i potem niszcz je i usuwaj z wektora. |
|
Krzyko Temat założony przez niniejszego użytkownika |
» 2014-02-21 23:20:21 Rzeczywiście, po prostu nie pomyślałem bo przecież można inaczej: Funkcja sprawdzania czy to już czas śmierci. bool del() { if( time.getElapsedTime().asSeconds() > czas ) { cout << "usuniety"; return true; } else return false; } I usuwanie z vectora jeśli del() zwraca prawdę. if( ile > 0 ) { Add( ile ); } for( int i = 0; i < ANIM.size(); i++ ) { if( ANIM[ i ].del() == true ) { ANIM.erase( ANIM.begin() + i ); } } for( int i = 0; i < ANIM.size(); i++ ) { ANIM[ i ].make(); } Dzięki za szybką odpowiedź! |
|
« 1 » |