Retourner la classe dans une de ses méthodes (bibliotheques SDL)

[Résolu]
Signaler
Messages postés
6
Date d'inscription
lundi 24 janvier 2011
Statut
Membre
Dernière intervention
15 août 2011
-
Messages postés
6
Date d'inscription
lundi 24 janvier 2011
Statut
Membre
Dernière intervention
15 août 2011
-
Bonjour à tous,
c'est mon premier message sur le forum, soyer indulgent svp pour toutes erreur ou répétitions de post.

Etudiant, je suis actuellement en cour de codage d'un jeux 2D (pour épreuve de BTS) avec la SDL en POO et je voudrais retourner avec une méthode un objet de sa propre classe. Je m'explique un peu mieux :

voici les fichiers composant mon projet (version simplifié ):

main.cpp

image.cpp & .h
class Image
{
public:
...
private:
SDL_Surface *m_image; //'objet' de la SDL permettant de gérer une image
SDL_Rect m_position; //'objet' de la SDL permettant de gérer la position à l'écran
};

imageInfo.cpp & .h
class InfoImage // destiné à faire un tableau dynamique d'objet 'Image' codé à la manière du langage C
{
public:
InfoImage *getAdresseImgSuiv()
...
private:
Image *m_image;
InfoImage *m_infoImageSuivante;
};

dictionnaire.cpp & .h
class Dictionnaire //Destiné à raffraichir toutes les surfaces du tableau dynamique d''infoImage'
{
public:
void retirerInfo(InfoImage *uneInfo);
...
private:
InfoImage *m_premierInfoImage;
InfoImage *m_dernierInfoImage;
int m_nbElement;

};
personnage.cpp & .h
class Personnage
{
public:
~Personnage();
....
private:
int m_vie;
InfoImage *m_image;
Dictionnaire *m_dictionnaire;
};


voici le problème dans l'ordre de la pile d'appel :

Personnage::~Personnage()
{
m_dictionnaire->retirerInfo(m_image);
delete m_image;
}

void Dictionnaire::retirerInfo(InfoImage *uneInfo) //Boucle jusqu'a trouvé l'adresse correspondante au paramètre
{
InfoImage *infoTmp(m_premierInfoImage), *infoComparaison;
//Test si la premiere carte est a supprimé
if (uneInfo == m_premierInfoImage)
{
infoTmp = m_premierInfoImage->getAdresseImgSuiv();
m_premierInfoImage = infoTmp;
}
else
{
//Boucle jusqu'à trouvé le paramètre dans le pointeur de l'info suivante
for(int i = 0; i < Dictionnaire::getNombreInfo(); i++)
{
infoTmp = infoComparaison->getAdresseImgSuiv();
if(infoComparaison == uneInfo)
{
InfoImage *infoNecessaire = NULL;
infoNecessaire = infoComparaison->getAdresseImgSuiv();
infoTmp->AllouerSuivant(infoNecessaire);
delete infoComparaison;
break;
}
infoTmp = infoComparaison;
}
}
infoTmp infoComparaison NULL;
delete infoTmp, infoComparaison;
m_nbElement--;
}

infoImmage* InfoImage::getAdresseImgSuiv()
{
return m_infoImageSuivante;
}

Le compilateur ne veut pas compiler, il ne connait pas l'objet 'infoImage' lorsqu'il compile la méthode 'infoImage* getAdresseImageSuiv()'. Connaitriez vous une méthode pour prédéfinir la classe ou autre.

Certaines personnes me diront que c'est pas la bonne solution de faire un tableau dynamique d'objet en C++, mais j'ai appris cette manière l'an dernier en cour de C, cela justifie mon choix. Mais je suis ouvert à toutes solutions et critiques sur cette méthode en C++.

Merci pour vos réponses.

PS: je vois dans l'aperçu que mon code n'est pas indenté, je ne sais pas comment on fait pr introduire du code correctement.

2 réponses

Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Fait une "forward declaration", ou pré-déclaration en français.
Ex (avec la balise
[ /code]):
[code=cpp]
class InfoImage; // Pré-déclaration

class InfoImage
{
  InfoImage* getAdresseImageSuiv();
};


Si tu cherchais à avoir une liste chaînée, un simple std::list aurait suffit :)
Pour dictionnaire, une std::map est son équivalent.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
6
Date d'inscription
lundi 24 janvier 2011
Statut
Membre
Dernière intervention
15 août 2011

Plus de problème de compilation. Merci beaucoup pour ta réponse et pour tes conseilles qui me serviront dans un avenir très proche.