Déclaration d'une class

Résolu
cs_Turok Messages postés 78 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 3 décembre 2011 - 12 déc. 2005 à 22:59
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008 - 14 déc. 2005 à 06:57
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

vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
13 déc. 2005 à 22:53
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 --
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
12 déc. 2005 à 23:53
"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.
0
vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
13 déc. 2005 à 02:25
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 --
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
13 déc. 2005 à 06:48
Tu peux aussi regarder du coté du "Singleton Design Pattern", au cas où ce serait plus approprié à ton problème...

neodelphi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Turok Messages postés 78 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 3 décembre 2011
13 déc. 2005 à 14:25
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);

}

...
0
vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
13 déc. 2005 à 18:19
Pourrais-tu indiquer l'erreur exacte que tu obtiens. Sans elle, il est impossible de t'aider.




-- Virtual Dust --
0
cs_Turok Messages postés 78 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 3 décembre 2011
13 déc. 2005 à 18:50
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
0
cs_Turok Messages postés 78 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 3 décembre 2011
13 déc. 2005 à 19:02
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
0
cs_Turok Messages postés 78 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 3 décembre 2011
13 déc. 2005 à 19:05
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
0
cs_Turok Messages postés 78 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 3 décembre 2011
13 déc. 2005 à 19:18
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
0
cs_Turok Messages postés 78 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 3 décembre 2011
14 déc. 2005 à 00:33
Ok, merci por l'info je vais essayer

Turok
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
14 déc. 2005 à 06:57
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
0
Rejoignez-nous