La creation d'objets en c++

[Résolu]
Signaler
Messages postés
99
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
17 septembre 2005
-
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
-
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

Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
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...
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
"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;

}
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
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...
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
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...
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
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.
Messages postés
99
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
17 septembre 2005

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
Messages postés
99
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
17 septembre 2005

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 ?
Messages postés
99
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
17 septembre 2005

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