La creation d'objets en c++

Résolu
whikie Messages postés 99 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 17 septembre 2005 - 10 août 2005 à 14:56
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 - 10 août 2005 à 16:14
Bonjour a tous,

Je suis toujours en train d'apprendre les bases du c++, et la je me lance pour creer des objets.
Je voudrais creer des objets 'cartes a jouer'
je suis arrivé a creer ces objets mais je ne dois pas bien m'y prendre.
en effet j'ai fait un petit programme pour verifier et ...
deux surprises que je ne comprend pas si quelqu'un veut bien m'expliquer
1) quand je me sers de de la fonction 'afficheCartes' je passe par le destructeur ... ???
2) j'arrive a acceder a un objet pas crée ???
je m'explique j'ai cree 52 cartes : Cartes test[52] et j'arrive a la variable de la carte test[-1].Culeur sans planter le programme???

je ne sais pas si je suis bien clair ...

voici le code :
#include


using namespace std;
enum eCouleur{pique,coeur,carreau,trefle};

class Cartes
{
public:
Cartes();
~Cartes();
eCouleur Culeur;
int Valeur;
Cartes *pSuivante;
void afficheCarte(Cartes param);
};


Cartes::~Cartes()
{
cout <<"bye bye";
//system ("pause");
}
void Cartes::afficheCarte(Cartes param)
{cout<<"compris"<
Cartes::Cartes()
{
pSuivante=0;
Culeur=coeur;
Valeur=0;
}
int main()
{
int couleur=0,valeur=0,compt=0;

Cartes test[52];

cout<<"Couleur de la premiere carte :"<<test[0].Culeur<<"\n";

test[0].afficheCarte(test[0]);
cout<<"fin de test";
cout<<test[0].pSuivante<<"\n";
for (couleur=0;couleur<4;++couleur)
for (valeur=1;valeur<14;++valeur)
{cout<<&test[compt]<<" adresse de test\n"<<"b="<<compt<<"\n";
test[compt].Culeur=eCouleur(couleur);
test[compt].Valeur=valeur;
cout <<" ATTENTION ICI compt= :"<<(compt-1)<<"\n";
test[compt-1].pSuivante=&test[compt];
compt++;
cout<<"compt ="<<compt<<" Couleur ="<<couleur<<"Valeur ="<<valeur<<"\n";
system ("pause");

}


test[1].pSuivante= &test[0];
cout<<test[1].Culeur<<"\n";
cout<<test[1].pSuivante<<" adresse de la carte precedente\n";

system("pause");
return 0;
}
je suis sous Xp et avec DevCpp 4.9.9.2

Merci d'avance

8 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
10 août 2005 à 15:02
Si tu utilise un objet carte dans la fonction afficheCartes, il est normal que tu passe par le destructeur de cet objet en quittant la fonction.

Ensuite, le fait d'accéder à test[-1] est possible MAIS CE N'EST PAS UNE CARTE!!! En dehors de ton tableau, tu touche à la mémoire qui n'a, a priori, rien à voir avec tes cartes. Si tu tombe vraiment sur une carte, considère ça comme un coup de bol...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
10 août 2005 à 15:20
"Je croyais que le fait de declarer Cartes test[52] me creait 52 objets cartes"



c'est vrai, et pour affiche :



void Cartes::afficheCarte()

{cout<<"compris"<<Culeur;

}
3
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
10 août 2005 à 15:30
Désolé si je me suis mal fait comprendre pour le coup du destructeur.

En fait, voilà:

void afficherCartes()
{
Cartes temp; // création d'un objet carte, local à la fonction

/* blabla */
} // ici, les objets locaux sont détruits: appel au destructeur de temp

Il vaut mieux faire ta fonction sur l'exemple de steve_clamage car, a priori, tu n'as pas besoin d'un objet Carte local...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
10 août 2005 à 15:59
Explication:
- je déclare un tableau de 10 chiffres que j'initialise comme suit: 0,1,2,3,4,5,6,7,8,9
- en mémoire, j'ai ça:
a-b-c-0-1-2-3-4-5-6-7-8-9-d-e-f-g

Quand tu écris tab[i], tu essaie d'accéder en fait à la case mémoire d'adresse tab+i (tab étant l'adresse du 1er élément du tableau).
Donc:
tab[2] --> accès à la case d'adresse tab+2, contenu=2
tab[10] --> accès à la case d'adresse tab+10, contenu=d (ce n'est pas à toi)

Pour ne pas que cela arrive, il faut soit que tu sache exactement le nombre d'objets dans ton tableau, soit que tu sois capable de reconnaitre le dernier élément

C'est plus clair?
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3

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

Posez votre question
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
10 août 2005 à 16:14
Ca n'a rien a voir avec la force du typage, c'est le mode unsafe qui
permet de jouer avec les pointeurs, comme buno l'a expliqué, tab[2] est
juste un sucre syntaxique pour *(tab + 2), le compilateur ne pourra
jamais t'empecher de faire tab - 1.
3
whikie Messages postés 99 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 17 septembre 2005
10 août 2005 à 15:17
Salut,

Merci pour ta reponse rapide.


D'accord si je passe par une des fonctions de ma classe je passe obligatoirement par le destructeur ????
Ca me parait surprenant c'est quand meme moi qui doit decider a quel moment je veux detruire mon objet non ?

Je croyais que le fait de declarer Cartes test[52] me creait 52 objets cartes donc je n'ai pas encore compris la creation d'objets ( je m'en doutais )

je suppose que je dois passer par new mais je n'arrive a comprendre la syntaxe a utiliser pour creer un tableau de 52 cartes.

whikie
0
whikie Messages postés 99 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 17 septembre 2005
10 août 2005 à 15:34
oki merci beaucoup

Mais alors comment je fais pour etre sur d'acceder a mes objets dans un tableau d'objets ?

Pour moi le fait de declarer Cartes test[52] je cree 52 cartes qui vont de test[0] a test[51] et en aucun cas je declare test[-1].

Si test[-1] n'est pas declaré je ne devrais pas pouvoir y acceder non ?
0
whikie Messages postés 99 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 17 septembre 2005
10 août 2005 à 16:09
oui merci encore

Ayant lu que le c++ etait 'fortement typé' je m'attendais a ce que le compilateur me surveille du coin de l'oeil et me previenne de mes etourderis mais je vois que c'est le contraire ...

A bientot
0
Rejoignez-nous