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

Résolu
cs_BobZeFlyer Messages postés 6 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 15 août 2011 - 30 janv. 2011 à 19:07
cs_BobZeFlyer Messages postés 6 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 15 août 2011 - 31 janv. 2011 à 19:43
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
31 janv. 2011 à 10:16
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
3
cs_BobZeFlyer Messages postés 6 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 15 août 2011
31 janv. 2011 à 19:43
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.
0
Rejoignez-nous