cs_Turok
Messages postés78Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention 3 décembre 2011
-
12 déc. 2005 à 22:59
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 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.
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 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.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 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.
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 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.
cs_Turok
Messages postés78Date d'inscriptionmardi 30 décembre 2003StatutMembreDerniè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 )
cs_Turok
Messages postés78Date d'inscriptionmardi 30 décembre 2003StatutMembreDerniè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.