Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Autodestrukcja obiektu, a jego miejsce w vectorze

Ostatnio zmodyfikowano 2014-02-21 23:20
Autor Wiadomość
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?


C/C++
#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(); //Przykładowo tutaj może być odwołanie do obiektu 0,
            //który został usunięty przez delete this; i istnieje tylko w vector
        }
        ile = 0;
    } while( true );
   
    return 0;
}
P-105083
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.
P-105085
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.
C/C++
bool del()
{
    if( time.getElapsedTime().asSeconds() > czas )
    {
        cout << "usuniety";
        return true;
    }
    else
         return false;
   
}
I usuwanie z vectora jeśli del() zwraca prawdę.
C/C++
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ź!
P-105086
« 1 »
  Strona 1 z 1