Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[debutant] Premier programme en C++, qu'en pensez-vous?

54 réponses
Avatar
Beware
Bonjour,

J'ai depuis une grosse semaine commenc=E9 =E0 apprendre le C++. Je
l'apprends de mani=E8re autonome (ce qui n'est pas totalement une
excuse). Pour ce fait, je suis les tutos pour C++ du site du zero.

J'ai donc utilis=E9 leur exemple de (tr=E9s tr=E9s) petit RPG, mais qui me
permet de manipuler certains concept de base en C++.

Pour en revenir donc =E0 ce message, je voudrais demander aux
connaisseurs qui peuvent et surtout qui veulent si il pouvait jeter un
oeil =E0 mon code pour me dire tout ce qu'il ne va pas et que par
cons=E9quent je devrais am=E9liorer (ou carr=E9ment changer :) )

Merci =E0 eux.

L'ensemble des fichiers sont disponibles =E0 cette adresse :
http://beware007.free.fr/Projet_C++/rpg/

Au revoir

PS : Je pr=E9cise que j'ai cod=E9 sous C::B et sous Linux.

10 réponses

1 2 3 4 5
Avatar
Gabriel Dos Reis
domi writes:

| Gabriel Dos Reis wrote:
|
| > Un peu comme Usenet :-)
|
| Mais Usenet est encore préservé (bien que cela dépende des groupes...)
| et les jeunes ne connaissent d'ailleurs même pas son existence.
| L'âge et le niveau restent encore largement supérieurs.
| Les fora Web, c'est devenu une poubelle (n'importe qui y va de son
| "tuto", où les jeunes de 18 ans jouent les cadors face à ceux d e 12,
| souvent en faisant du copier-coller de vieux posts de Usenet quand un
| lien Google tombe dessus :-)

OK. À l'évidence, j'ai peu d'expérience des sites ados :-)

-- Gaby
Avatar
Michael Doubez
On 28 juil, 13:02, "jerome" wrote:
"Michael Doubez" a écrit dans le message de ne ws:


> Je ne connais pas de bon tutoriel c++

Non, il ne peut y en avoir par définition.



Ce dépends des objectif. AMA un tutoriel permet de prendre pied avec
un langage de façon ludique en suivant un cheminement spécifique.

J'espère que le C++ n'est pas abscon et ennuyeux au point qu'un bon
tutoriel ne puisse exister.

> mais il y a aussi celui de devellopez qui semble assez fourni
>http://cpp.developpez.com/

C'est nul (et c'est un euphémisme)



Il y a "thinking in C++" de Bruce Eckel traduit en français dans la
section tutoriel. Même si je ne suis pas fan des thinking in..., je
pense qu'ils peuvent faire de bon tutoriels.

--
Michael
Avatar
Beware
Bonjour à tous,

On dirait que mon message disant que je lisais le tuto du site du zero
a déchainé les passions.

Concernant mon programme suivant les conseils donnés :
- j'ai changé les define par des enums (mais j'aimerais savoir en
quoi il est mieux d'utiliser les enum que les defines?)
- j'ai rajouté un peu de code dans les destructeurs des fonctions
combat et personnage. Mais je sais pas si c'est propre ou pas.

Mais j'ai pas encore tout fini.

Merci

PS : fichiers toujours dispos sur : http://beware007.free.fr/Projet_C++/rpg /
Avatar
Michael Doubez
On 29 juil, 12:25, Beware wrote:
Bonjour à tous,

On dirait que mon message disant que je lisais le tuto du site du zero
a déchainé les passions.

Concernant mon programme suivant les conseils donnés :
 - j'ai changé les define par des enums (mais j'aimerais savoir en
quoi il est mieux d'utiliser les enum que les defines?)



Parce que:
- un nom de define n'a pas de portée (il est remplacé partout où il
apparait); c'est pour éviter les problèmes de conflit qu'ils sont mis
en majuscule (en général).
- un define peut être n'importe quoi - y compris un appel de
fonction couteux
- le nom d'un enum apparait dans gdb
- le compilo te dit quand tu oublie une valeur d'enum dans un switch
- un enum permet de contraindre les valeurs d'entrée aux valeurs
d'enum connu (pas int)

 - j'ai rajouté un peu de code dans les destructeurs des fonctions
combat et personnage. Mais je sais pas si c'est propre ou pas.



Tu n'as pas besoin de tester si un pointeur est NULL pour appeler
delete dessus.

Mais j'ai pas encore tout fini.



Un petit point de design:

Je pense que ton armurerie est un bon candidat pour le pattern
prototype. Au lieu de créer tes objets à la volée, tu les crées dan s
un conteneur initialisé au démarrage:
std::vector<Arme> armes_en_stock;
armes_en_stock.push_back(Arme("Lance", LANCE_DG));
armes_en_stock.push_back(Arme("Epée en Bronze", EPEE_BRONZE_DG));
...

Pour l'affichage, tu utilise une boucle et tu as directment accès à
une arme par son index:
for(size_t i=0;i<armes_en_stock;++i)
{
Arme& arme=armes_en_stock[i];
cout <<(i+1)<<" - "<<arme.getNom()<<" (dégats : "<<arme.getDegats()
<<" )n";
}

Puis pour un choix d'index:
Arme* arme=new Arme(armes_en_stock[i]);

Comme ça, quand tu ajoutes ou enlèves une arme, tu n'a pas besoin
d'aller faire des modifs partout ou de recalculer un index.

--
Michael
Avatar
Luc Hermitte
On 28 juil, 20:17, Antoine wrote:
Gabriel Dos Reis wrote:

  > ouais, m'enfin l'âge n'est pas vraiment déterminant...

Parce que tu n'as pas dû aller faire un tour sur les forums d'ados genr e
sdz ou developpez :-)

C'est du genre, en langage SMS insupportable à lire : "C++, cé plus
puissant que C", "C++, sa me fé tro kifé", etc...



Hum ... cela doit faire un moment que tu n'y as plus mis les pieds.
Mais un sacré moment alors.

C'est 12-15 ans de moyenne, et d'un niveau technique d'une nullité
ahurissante, qu'on ne peut vraiment pas comparer à celle d'un
consultant, même moyen, de 45 balais ayant 20 ans d'expérience en SSI I
ou Freelance.
C'est un autre monde.



Cela ne nous empêche pas d'essayer de remonter le niveau quand on le
voit bas.
Et mine de rien, bien guidés, ils apprennent vite ces petits jeunes.
C'est sûr cela demande du boulot et aussi du tact (qu'ils n'ont pas
toujours au début, d'où le phénomène cador que l'on peut parfois
observer)

--
Luc Hermitte
Avatar
Wykaaa
Beware a écrit :
Bonjour à tous,

On dirait que mon message disant que je lisais le tuto du site du zero
a déchainé les passions.

Concernant mon programme suivant les conseils donnés :
- j'ai changé les define par des enums (mais j'aimerais savoir en
quoi il est mieux d'utiliser les enum que les defines?)
- j'ai rajouté un peu de code dans les destructeurs des fonctions
combat et personnage. Mais je sais pas si c'est propre ou pas.

Mais j'ai pas encore tout fini.

Merci

PS : fichiers toujours dispos sur : http://beware007.free.fr/Projet_C++/rpg/



Il est préférable d'utiliser les enums plutôt que les defines parce que,
quand on définit un enum on définit un type. Le compilateur peut faire
de meilleurs contrôle sur l'utilisation des valeurs de l'énum et on
connaît précisément les valeurs valides des variables de ce type.
Avatar
Luc Hermitte
On 28 juil, 18:54, Antoine wrote:
  >>Lis un bon bouquin (Deitel ou autre) si tu veux apprendre sérieus ement.
>>Il n'y a pas d'autres méthodes...

> N'importe quoi. On peut très bien apprendre sérieusement d'un nombr e
> infini de méthodes.

Mais bien sûr, et la marmotte.
Tu as vu le niveau sur ces forums de ceux qui sortent "je maitrise le C
et le C++" ? C'est à tomber à la renverse !



Dans mes souvenirs, meilleur que dans le Deitel. Mais il y a eu des
rééditions c'est vrai. Et puis il existe bien pire en bouquin.

La seule manière valable pour apprendre depuis la création des langag es
est avec les livres de référence.



Ma foi, j'ai appris ici (merci, dans le désordre à James, Gaby, Michel
et tous les autres dont le nom ne me revient pas sur l'instant), et
avec un compilateur.
Les bouquins c'est bien, mais il arrive au moment que l'on en connait
l'essentiel. Ils restent alors de bonnes références pour les points de
détails que l'on ne retient pas toujours.

Tu ne dois pas être très âgé, ni expérimenté...



Arf. Non, franchement. Les arguments /ad hominen/ comme ceux là, ça
marche pas bien.

--
Luc Hermitte
Avatar
Beware
On 29 juil, 13:15, Michael Doubez wrote:
On 29 juil, 12:25, Beware wrote:

> Bonjour à tous,

> On dirait que mon message disant que je lisais le tuto du site du zero
> a déchainé les passions.

> Concernant mon programme suivant les conseils donnés :
>  - j'ai changé les define par des enums (mais j'aimerais savoir en
> quoi il est mieux d'utiliser les enum que les defines?)

Parce que:
  - un nom de define n'a pas de portée (il est remplacé partout o ù il
apparait); c'est pour éviter les problèmes de conflit qu'ils sont mis
en majuscule (en général).
  - un define peut être n'importe quoi - y compris un appel de
fonction couteux
  - le nom d'un enum apparait dans gdb
  - le compilo te dit quand tu oublie une valeur d'enum dans un switch
  - un enum permet de contraindre les valeurs d'entrée aux valeurs
d'enum connu (pas int)

>  - j'ai rajouté un peu de code dans les destructeurs des fonctions
> combat et personnage. Mais je sais pas si c'est propre ou pas.

Tu n'as pas besoin de tester si un pointeur est NULL pour appeler
delete dessus.

> Mais j'ai pas encore tout fini.

Un petit point de design:

Je pense que ton armurerie est un bon candidat pour le pattern
prototype. Au lieu de créer tes objets à la volée, tu les crées d ans
un conteneur initialisé au démarrage:
std::vector<Arme> armes_en_stock;
armes_en_stock.push_back(Arme("Lance", LANCE_DG));
armes_en_stock.push_back(Arme("Epée en Bronze", EPEE_BRONZE_DG));
...

Pour l'affichage, tu utilise une boucle et tu as directment accès à
une arme par son index:
for(size_t i=0;i<armes_en_stock;++i)
{
  Arme& arme=armes_en_stock[i];
  cout <<(i+1)<<" - "<<arme.getNom()<<" (dégats : "<<arme.getDegats()
<<" )n";

}

Puis pour un choix d'index:
Arme* arme=new Arme(armes_en_stock[i]);

Comme ça, quand tu ajoutes ou enlèves une arme, tu n'a pas besoin
d'aller faire des modifs partout ou de recalculer un index.

--
Michael



Bonjour,

Merci pour ton aide.

Pour les detele , j'ai du mal comprendre ce que tu voulais dire par :
"tu fais un delete dans le destructeur de Personnage alors que m_arme
n'a pas été positionné. "

De plus, pourquoi vois tu la création du pointeur combat1 dans le main
comme étant un souci.

Je vais explorer ton idee pour l'armurerie. Je ne l'avais pas fait,
car je connais pas du tout
Avatar
Michael Doubez
On 29 juil, 16:05, Beware wrote:
On 29 juil, 13:15, Michael Doubez wrote:



> On 29 juil, 12:25, Beware wrote:

> > Bonjour à tous,

> > On dirait que mon message disant que je lisais le tuto du site du zer o
> > a déchainé les passions.

> > Concernant mon programme suivant les conseils donnés :
> >  - j'ai changé les define par des enums (mais j'aimerais savoir e n
> > quoi il est mieux d'utiliser les enum que les defines?)

> Parce que:
>   - un nom de define n'a pas de portée (il est remplacé partout o ù il
> apparait); c'est pour éviter les problèmes de conflit qu'ils sont m is
> en majuscule (en général).
>   - un define peut être n'importe quoi - y compris un appel de
> fonction couteux
>   - le nom d'un enum apparait dans gdb
>   - le compilo te dit quand tu oublie une valeur d'enum dans un switc h
>   - un enum permet de contraindre les valeurs d'entrée aux valeurs
> d'enum connu (pas int)

> >  - j'ai rajouté un peu de code dans les destructeurs des fonction s
> > combat et personnage. Mais je sais pas si c'est propre ou pas.

> Tu n'as pas besoin de tester si un pointeur est NULL pour appeler
> delete dessus.

> > Mais j'ai pas encore tout fini.

> Un petit point de design:

> Je pense que ton armurerie est un bon candidat pour le pattern
> prototype. Au lieu de créer tes objets à la volée, tu les crées dans
> un conteneur initialisé au démarrage:
> std::vector<Arme> armes_en_stock;
> armes_en_stock.push_back(Arme("Lance", LANCE_DG));
> armes_en_stock.push_back(Arme("Epée en Bronze", EPEE_BRONZE_DG));
> ...

> Pour l'affichage, tu utilise une boucle et tu as directment accès à
> une arme par son index:
> for(size_t i=0;i<armes_en_stock;++i)
> {
>   Arme& arme=armes_en_stock[i];
>   cout <<(i+1)<<" - "<<arme.getNom()<<" (dégats : "<<arme.getDegats ()
> <<" )n";

> }

> Puis pour un choix d'index:
> Arme* arme=new Arme(armes_en_stock[i]);

> Comme ça, quand tu ajoutes ou enlèves une arme, tu n'a pas besoin
> d'aller faire des modifs partout ou de recalculer un index.

> --
> Michael

Bonjour,

Merci pour ton aide.

Pour les detele , j'ai du mal comprendre ce que tu voulais dire par :
"tu fais un delete dans le destructeur de Personnage alors que m_arme
n'a pas été positionné. "



Dans le constructeur, tu ne mettais pas m_arme à NULL donc il pouvait
prendre une valeur quelconque qui aurait été utilisée dans le
destructeur par delete. Un candidat au segfault.

Soit tu l'as modifié, soit j'avais mal vu parce qu'il est bien mis à
NULL dans la dernière version.

De plus, pourquoi vois tu la création du pointeur combat1 dans le main
comme étant un souci.



Ce n'est pas un problème mais dans la mesure où tu n'as pas besoin de
detruire/recréer combat1, il n'y a pas de raison de l'allouer par un
new (et ça t'évite un delete qui d'ailleurs est bizarrement placé).

Je vais explorer ton idee pour l'armurerie. Je ne l'avais pas fait,
car je connais pas du tout



Le but est d'éviter des opérations fastidieuses.

--
Michael
Avatar
Beware
On 29 juil, 17:03, Michael Doubez wrote:
On 29 juil, 16:05, Beware wrote:



> On 29 juil, 13:15, Michael Doubez wrote:

> > On 29 juil, 12:25, Beware wrote:

> > > Bonjour à tous,

> > > On dirait que mon message disant que je lisais le tuto du site du z ero
> > > a déchainé les passions.

> > > Concernant mon programme suivant les conseils donnés :
> > >  - j'ai changé les define par des enums (mais j'aimerais savoir en
> > > quoi il est mieux d'utiliser les enum que les defines?)

> > Parce que:
> >   - un nom de define n'a pas de portée (il est remplacé partout où il
> > apparait); c'est pour éviter les problèmes de conflit qu'ils sont mis
> > en majuscule (en général).
> >   - un define peut être n'importe quoi - y compris un appel de
> > fonction couteux
> >   - le nom d'un enum apparait dans gdb
> >   - le compilo te dit quand tu oublie une valeur d'enum dans un swi tch
> >   - un enum permet de contraindre les valeurs d'entrée aux valeur s
> > d'enum connu (pas int)

> > >  - j'ai rajouté un peu de code dans les destructeurs des foncti ons
> > > combat et personnage. Mais je sais pas si c'est propre ou pas.

> > Tu n'as pas besoin de tester si un pointeur est NULL pour appeler
> > delete dessus.

> > > Mais j'ai pas encore tout fini.

> > Un petit point de design:

> > Je pense que ton armurerie est un bon candidat pour le pattern
> > prototype. Au lieu de créer tes objets à la volée, tu les cré es dans
> > un conteneur initialisé au démarrage:
> > std::vector<Arme> armes_en_stock;
> > armes_en_stock.push_back(Arme("Lance", LANCE_DG));
> > armes_en_stock.push_back(Arme("Epée en Bronze", EPEE_BRONZE_DG));
> > ...

> > Pour l'affichage, tu utilise une boucle et tu as directment accès à
> > une arme par son index:
> > for(size_t i=0;i<armes_en_stock;++i)
> > {
> >   Arme& arme=armes_en_stock[i];
> >   cout <<(i+1)<<" - "<<arme.getNom()<<" (dégats : "<<arme.getDega ts()
> > <<" )n";

> > }

> > Puis pour un choix d'index:
> > Arme* arme=new Arme(armes_en_stock[i]);

> > Comme ça, quand tu ajoutes ou enlèves une arme, tu n'a pas besoin
> > d'aller faire des modifs partout ou de recalculer un index.

> > --
> > Michael

> Bonjour,

> Merci pour ton aide.

> Pour les detele , j'ai du mal comprendre ce que tu voulais dire par :
> "tu fais un delete dans le destructeur de Personnage alors que m_arme
> n'a pas été positionné. "

Dans le constructeur, tu ne mettais pas m_arme à NULL donc il pouvait
prendre une valeur quelconque qui aurait été utilisée dans le
destructeur par delete. Un candidat au segfault.

Soit tu l'as modifié, soit j'avais mal vu parce qu'il est bien mis à
NULL dans la dernière version.

> De plus, pourquoi vois tu la création du pointeur combat1 dans le mai n
> comme étant un souci.

Ce n'est pas un problème mais dans la mesure où tu n'as pas besoin de
detruire/recréer combat1, il n'y a pas de raison de l'allouer par un
new (et ça t'évite un delete qui d'ailleurs est bizarrement placé).

> Je vais explorer ton idee pour l'armurerie. Je ne l'avais pas fait,
> car je connais pas du tout

Le but est d'éviter des opérations fastidieuses.

--
Michael



Salut

Pour l'histoire de m_arme, j'ai compris ce que tu voulais dire. Il est
possible que je l'ai modifié entre temps sans prévenir.

Pour le combat je verrais ca aprés (l'interet de faire un new et un
delete).
Parce que la, j'avoue que je bloque un peu sur l'utilisation du
vector. j'ai d'ailleurs une question :

j'ai mis ce code :
vector < Arme > armes_en_stock;
armes_en_stock.push_back(Arme("Lance", LANCE_DG));
armes_en_stock.push_back(Arme("Epée en Bronze", EPEE_BRONZE_DG));
armes_en_stock.push_back(Arme("Hache en fer", HACHE_FER_DG));
armes_en_stock.push_back(Arme("Hallebarde", HALLEBARDE_DG));
armes_en_stock.push_back(Arme("Epée à doubles tranchants",
EPEE_DOUBLE_TRANCHANT_DG));
armes_en_stock.push_back(Arme("Hache Lourde", HACHE_LOURDE_DG));

dans la fonction equiperarme de mon armuerie.cpp.

Cependant, si j'ai bien tout lu freud, il va me creer ce vector a
chaque fois que je ferais appel a la fonction equiperarme, n'est ce
pas la un peu lourd ?

Bien que je ne voie pas pour l'instant ou l'initialiser autre part et
y avoir accés dans mes fonctions.

Merci
1 2 3 4 5