Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: list et destructeur  (Lu 2476 fois)

0 Membres et 1 Invité sur ce sujet

Hindi

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
list et destructeur
« le: Mai 05, 2012, 12:28:51 pm »
J'ai plusieurs erreurs liées aux destructeurs, que je ne comprends pas et qui font crasher mon jeu quand je le quitte.

Premièrement, quand je détruit mes ennemis dans le jeu (en tirant dessus donc), j'utilise cette fonction :
void Population::checkPopulation()
{
    if(this->haveEnnemyInProgress())
    {
        list<Enemy*>::iterator lit(m_enemies.begin());
        for(; lit!=m_enemies.end();)
        {
            if((*lit)->isDead())
            {
                this->explode(*lit);
                lit = m_enemies.erase(lit);
            }
            else
            {
                lit++;
            }
        }
    }
}

La méthode à l'air de bien fonctionner, les ennemis sont détruits au fur et à mesure.
Par contre dans le destructeur de ma classe, je ne peux pas implémenter cette solution (adaptée, sans le isDead()) car il me sort l'erreur :

Citer
G:\projets\cours\jeu\population.cpp|22|error: no matching function for call to 'std::list<Enemy*, std::allocator<Enemy*> >::erase(std::_List_const_iterator<Enemy*>&)'|
e:\utilitaires\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\list.tcc|107|note: candidates are: std::_List_iterator<_Tp> std::list<_Tp, _Alloc>::erase(std::_List_iterator<_Tp>) [with _Tp = Enemy*, _Alloc = std::allocator<Enemy*>]|


J'ai un autre problème lors de la fin de partie, le jeu crash lors de la suppression des images et des animations, voilà un exemple pour des images:

Dans le code ci-dessous, listStar est rempli de copies de spriteStar.

Background::Background(RenderWindow &app, int speed, int SCREEN_WIDTH, int SCREEN_HEIGHT): m_app(app), m_speed(speed), m_width(SCREEN_WIDTH), m_height(SCREEN_HEIGHT)
{
    static Image* imageStar = new Image;
    if(!(imageStar->LoadFromFile("images/projectile.png")))
    {
        cerr << "Impossible de charger : projectile.png" << endl;
    }
    else
    {
        spriteStar.SetImage(*imageStar);
    }
    static Image* imagePlanet = new Image;
    if(!(imagePlanet->LoadFromFile("images/projectile2.png")))
    {
        cerr << "Impossible de charger : projectile.png" << endl;
    }
    else
    {
        spritePlanet.SetImage(*imagePlanet);
    }

    this->init();
}

Background::~Background()
{
    listStar.clear();
    cout << "background1" << endl;
    if(imageStar!=NULL)
       delete imageStar;
    if(imagePlanet!=NULL)
        delete imagePlanet;
    cout << "background2" << endl;
}
 

EDIT : Je voudrais surtout savoir si je m'y prends mal avec les delete, si il faut utiliser une autre méthode, ou si ça vient juste de l'odre de supression qui est pas bon (essayer de suprimer un élément qui n'existe plus par exemple) ? La vérification avec le if(var!=NULL) est-elle correcte ?
« Modifié: Mai 05, 2012, 10:43:11 pm par Hindi »

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : list et destructeur
« Réponse #1 le: Mai 06, 2012, 06:36:12 pm »
Pour le 1er truc, poste-nous le destructeur qui ne compile pas sinon on peut pas t'aider...
Pour le 2eme truc, faudrait que tu nous dises exactement où ça crash et avec quel message, et le if(var!=NULL) sert strictement à rien

Hindi

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : list et destructeur
« Réponse #2 le: Mai 08, 2012, 11:38:30 am »
Désolé pour le retard !
Les problèmes sont finalement résolus.
Pour le premier, c'était bêtement un cont iterator au lieu d'un iterator.
Pour le deuxième ça foirait à plusieurs endroits, principalement à cause de problèmes d'images static.