Déclaration d'une class [Résolu]

Signaler
Messages postés
78
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2011
-
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Statut
Membre
Dernière intervention
11 août 2008
-
Salut,

Je débute en C++, et dans mon prog j'ai créer une class. Le prob, c'est
que quand une instance de cette class (Class_object
objet("<nomdefichier>"), pour pouvoir m'en servir dans les autres
fonctions, je suis obligés de le passer en argument de chaque fonction,
ce qui est génant s'il y beaucoup de class et de fonctions.

J'aimerai savoir comment la rendre globale par tout le programme pour
ne pas avoir à la passer comme argument à chaque fois, car quand je
créé l'instance en dehors d'une fonction ca plante.



Merci
Turok

12 réponses

Messages postés
43
Date d'inscription
jeudi 16 décembre 2004
Statut
Membre
Dernière intervention
14 mars 2007

L'erreur que tu obtiens est typique d'une tentative d'accès à un objet non initialisé ou détruit.

Si tu veux savoir d'où vient l'erreur (quelle variable exactement) je
te conseille d'effectuer une exécution pas à pas à partir du
constructeur en mode débogage, en plaçant un Point d'arrêt au début de
celui-ci.


-- Virtual Dust --
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
"car quand je créé l'instance en dehors d'une fonction ca plante." => et ben c'est pas normal.



"J'aimerai savoir comment la rendre globale" => c'est exactement ca,
il te suffit de déclarer l'instance en dehors de toute fonction, par
exemple en haut du programme. Il faudrait quand déclarer la définition
de ta classe.



Ainsi le début de ton programme cera:



#include...



class Class_object;



Class_object objet("nom_defichier");





class Class_object


{


...


};



... tes foncions



int main(...)

{

...

}


Mais faut éviter d'abuser des variables globales.
Messages postés
43
Date d'inscription
jeudi 16 décembre 2004
Statut
Membre
Dernière intervention
14 mars 2007

Je suis d'accord avec luhtor, sauf pour la création de l'objet : J'aurais plus tendance à utiliser un pointeurs global :



Class_object* pobject = (Class_object*) 0;



et dans le main :



int main(...)

{

pobject = new Class_object("nom_defichier");

...



//Ne pas oublier de détruire l'objet lorsqu'on n'en a plus besoin

delete pobject;

pobject = (Class_object*) 0;



...

}



Ainsi, tes fonctions externes manipulent le pointeur (le point '.' pour
accéder aux membres est alors remplacé par "->"). Mais l'utilisation
de pointeurs demandent une grande rigueur vis-à-vis de l'initialisation
et de la destruction des objets pointés (notamment, des tests de
nullité du pointeur partout où il doit être utilisé sont les bienvenue)
; a fortiori lorsqu'il s'agit d'un pointeur global.



Maintenant, une autre petite remarque/question : que font tes
fonctions exactements ? Si elles se contentent de manipuler uniquement
des membres de ta classe, dans ce cas, il est plus judicieux de
déclarer ces fonctions comme membres de ladite classe. Dans ce cas, il
n'y a plus besoin de passer une instance en argument, et l'instance n'a
plus besoin d'être globale.

-- Virtual Dust --
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Statut
Membre
Dernière intervention
11 août 2008

Tu peux aussi regarder du coté du "Singleton Design Pattern", au cas où ce serait plus approprié à ton problème...

neodelphi
Messages postés
78
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2011

Pour l'utilisation des pointeurs, je ne préfère pas car je ne les maitrise pas encore.

Pour le "Singleton Design Pattern", j'ignore ce que c'est.

Sinon lorsque j'essaye de mettre l'instance en dehoers de la fonction,
je peux compiler, mais au démarrage du prog il y a tout de suite une
erreur windows.



Voici la structure du prog:

//Dans le fichier entête: "main.h"

class Class_Object

{



private:



float frame;



//frame du sprite animé



int pos_X;



//position en
X du sprite

int pos_Y;



//position en
Y du sprite



SDL_Surface
*surface;


//surface de l'objet

SDL_Rect
rectDest;


//rectangle de destination de
l'objet

SDL_Rect
rectScr;


//rectangle de la position de
l'objet



//...



public:



Class_Object(char*
filename);


void Draw(SDL_Surface
*sdlMainScreen);


void Move(int X,int
Y)
{pos_X+=X; pos_Y+=Y;}



//...

ensuite il y a la fonction main dans le fichier "Main.cpp"

la fonction main appelle la fonction "New_Game" qui se situe dans le fichier "Jeu.cpp" et dont voici le code :

#include "main.h"



class Class_Object;

Class_Object player("al");



void New_Game(SDL_Surface *sdlMainScreen, int level )

{

player.Set_pos(0,0);

Run(sdlMainScreen);

}

...
Messages postés
43
Date d'inscription
jeudi 16 décembre 2004
Statut
Membre
Dernière intervention
14 mars 2007

Pourrais-tu indiquer l'erreur exacte que tu obtiens. Sans elle, il est impossible de t'aider.




-- Virtual Dust --
Messages postés
78
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2011

Justement, il n'y a pas d'erreur à la compilation.

Mais quand je lance le prog, windows me sort la fenetre de plantage, celle où il y a écrit :

"SDL project à rencontré un problème et doit fermer...
...

Déboquer/Envoyer le rapport d'erreur/Ne pas envoyer"


Turok
Messages postés
78
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2011

A si, si je le passe en mode débug il me sort :

Unhandled exception in SDL Project.exe(SDL.DLL):0xC0000005 : access violation.
et
la une flêche pointe à la ligne "10027305
mov ecx,dword ptr
[eax+138h]" de la fenetre disassembly.


Turok
Messages postés
78
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2011

Après test, il s'avère que ça ne plante plus si j'enlève le constructeur.

Mais pourquoi?



nota: j'ai oublié de monter ce fichier tout à l'heure



//Objet.cpp



#include "main.h"





Class_Object::Class_Object(char *filename)

{



SDL_Surface *temp;

temp = SDL_LoadBMP(filename);

surface=SDL_DisplayFormat(temp);

SDL_FreeSurface(temp);



}





void Class_Object::Draw(SDL_Surface *sdlMainScreen)

{



rectDest.x=pos_X;

rectDest.y=pos_Y;



SDL_BlitSurface(surface, NULL, sdlMainScreen, &rectDest);



}




Turok
Messages postés
78
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2011

En supprimant le constructeur, et en le remplaçant par une méthode pour charger les images ça marche.

Je ne comprend pas pourquoi ça plante si j'incluait le chargement de l'image dans la méthode.

Turok
Messages postés
78
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2011

Ok, merci por l'info je vais essayer

Turok
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Statut
Membre
Dernière intervention
11 août 2008

Une classe en singleton est une classe qui ne peu être instanciée
qu'une seule fois, et dont tu peut récupérer l'instance n'importe où
dans le code.



Exemple:



// Récupération de l'instance

CTimeBase* ptimebase = CTimeBase::getInstance();



// Uitlisation

ptimebase->getFps();



Bien sur ces deux lignes ne peuvent faire qu'une...

neodelphi