CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Organisation pour ses classes ?

News jeu

Expeditions: Samurai veut révolutionner le RPG tactique avec une aventure entièrement jouable en coop

Voir
JamereBurvelle
JamereBurvelle
Niveau 40
15 mai 2012 à 17:55:58

Bonjour, j'ai commencé la programmation avec le langage C, que je "maîtrise" dirons nous, mais j'essaie de passer au C++ et je n'arrive pas bien à cerner l'utilité des classes etc...

A vrai dire je comprends en quoi c'est utile, mais j'ai énormément de difficulté pour ce qui est de l'organisation, je n'arrive pas à voir quand faire des classes, pour quoi...

Vous n'auriez pas des conseils/liens pour mieux m'expliquer ça ? J'ai l'impression de passer à côté de quelque chose, pourtant j'essaie de faire des programmes avec des classes mais je me retrouve toujours à m'embrouiller au final.

Merci d'avance :)

godrik
godrik
Niveau 30
15 mai 2012 à 18:02:53

Basiquement, les classes servent principalement comme des "super structures". En C, tu regroupais tes donnees en structures. C++ permet d'ajouter des fonctions a ces structures pour regrouper les donnees et les operations sur ces donnees.

JamereBurvelle
JamereBurvelle
Niveau 40
15 mai 2012 à 18:08:16

Oui, j'ai bien assimilé le principe, avec les méthodes pour accéder à un élément et lui donner une valeur, mais je trouve que c'est plus un casse tête qu'autre chose, en C il n'y avait pas tous ces soucis...

Par exemple, pour un jeu en tile mapping, il faudrait : une classe "carte" qui contiendrait plusieurs objets de type "case", et leurs propres méthodes et attributs à chacun d'entre eux, je trouve ça plus compliqué...

godrik
godrik
Niveau 30
15 mai 2012 à 19:09:08

C'est plus d'organization, mais ca apporte de la souplesse dans l'implementation. Si tu ne vois pas d'interet a cette ecriture, alors ne l'utilises pas. Tu comprendras l'interet plus tard avec de l'experience, ou tu auras developpe des techniques alternatives.

Selrahc282
Selrahc282
Niveau 10
15 mai 2012 à 20:10:27

Depuis que j'ai touché aux objets j'aurais de la misère à ne plus m'en servir, c'est très utile, ça facilite la programmation un coup que tu as bien compris.

RadiumHD
RadiumHD
Niveau 10
15 mai 2012 à 20:42:54

Habitue toi rapidement à utiliser les classes car elles sont omniprésentes
Selrahc282, une fois qu'on est habitué on peut plus s'en passer

JamereBurvelle
JamereBurvelle
Niveau 40
15 mai 2012 à 22:11:42

Bah justement, je me demande si je dois me forcer à les utiliser maintenant où continuer sans jusqu'à en trouver une utilité ?

godrik
godrik
Niveau 30
15 mai 2012 à 22:18:12

Se forcer a utiliser un construct du langage ne t'apportera rien a mon avis. Il te faut visiblement un peu plus d'experience avant de voir l'utilite des classes apparaitre.

Paulop
Paulop
Niveau 12
15 mai 2012 à 22:27:45

Et il vaut mieux je pense savoir s'en passer, parce qu'on en a pas toujours besoin, et ça peut apporter beaucoup de complexité là où on n'en a pas besoin.

JamereBurvelle
JamereBurvelle
Niveau 40
15 mai 2012 à 22:50:20

Ok merci, autant j'ai tout de suite trouvé une utilité aux structures en C, mais les classes... Je vais continuer à les utiliser mais sans me forcer :)

chris_27
chris_27
Niveau 10
15 mai 2012 à 23:32:55

« Si tu ne vois pas d'intérêt à cette écriture, alors ne l'utilise pas » :d) +1000.

Pour une fois, on ne tombe pas sur quelqu'un qui voit des classes même là où il n'y en as pas. :content:

Après, je vais te donner les deux grandes utilités de la POO en C++ que j'ai mise en évidence en codant dans diverses (en fait 2) gros projets :

1. la POO, ça permet de se débarrasser des pointeurs en grande partie. Et les pointeurs, disons le une bonne fois pour toute, c'est le MAL. En fait, il se passe deux choses avec la POO en C++ :

1a. À chaque fois que tu crées un objet de façon directe (sans utiliser new donc, mais comme tu créerais une variable de type int), la place pour cet objet est allouée toute seule. Et comme pour un int, cette place est libérée dès que tu sors du bloc de code où l'objet a été créé (sauf si tu passes l'objet à return, bien sur). Et c'est valable pour TOUS les objets. En C, dès que quelqu'un veut cacher des détails d'implantation, tu te retrouves avec un type mon_type_t abstrait, et donc moultes pointeurs mon_type_t* et l'obligation d'appeler des fonctions init() et free() :peur: . En C++, tu caches les détails d'implantation dans les champs "private" de ta classe, mais ta classe une fois définie peut vraiment se comporter comme un type de base genre int. :content:

1b. Tu as des tas de pointeurs qui sont cachés. Quand tu utilises la classe vector (les tableaux C++) de la librairie STL, évidemment qu'il y a des pointeurs partout sous le tapis ... mais toi tu n'en vois pas ! De manière générale, les histoires de pointeurs sont réglés par les constructeurs et destructeurs de tes classes, ce qui localise fortement le code avec des pointeurs, et permet d'éviter un nombre considérable de bugs.

Ajoute à ça le fait d'utiliser des références pour les arguments susceptibles de changer de valeur à l'appel d'une fonction, et tu ne vois quasiment plus de pointeurs :ange:
(En fait, les pointeurs ne servent guère que pour avoir du polymorphisme avec le mécanisme des classes abstraites, mais c'est déjà une utilisation avancée du C++).

2. la POO, ça permet de mélanger les serviettes et les torchons. Si, si, enfin presque quoi ! :o))

Prenons un exemple plus concret. Suppose un jeu simple avec des joueurs, des monstres, et des coups entre tout ce beau monde. Évidemment, les joueurs sont joués par des humains connectés en réseau, et les monstres sont joués par une des machines (le serveur).

Donc en C, tu as deux types bien distincts : joueur_t et monstre_t. Évidemment, tu as deux fichiers différents, qui vont appeler une même base commune dans un troisième fichier. Tout ça se tient bien.

Le soucis, c'est au moment tu te dis que ce serait bien d'afficher les points de vie de tout ce beau monde à l'écran. D'ailleurs, ça serait mieux si c'était trier par ordre décroissant tiens. Et là, c'est le drame. :peur:
Tu as deux solutions "naturelles" :

a. tu mets les points de vie de tout le monde dans un tableau et tu tries. Soucis : comment on sait à qui correspond une quantité de point de vie donnée (pour afficher le nom en face de ces points de vie par exemple) ? Il faut donc coller aux points de vie des informations supplémentaires, mais on ne peut pas faire un tableau avec à la fois des joueur_t et des monstre_t. Il faut donc soit filtrer la partie des données intéressantes, soit jouer avec des void* + test pour savoir si c'est un joueur_t* ou un monstre_t* qui colle au int des points de vies. Dans les deux cas, beurk. :malade:

b. tu tries à part les joueurs et les monstres, et tu t'arranges pour afficher les choses dans le bon ordre en jonglant sur deux tableaux. Bon, faut pas se planter... et puis imagine un jeu plus plus complexe ou j'ajoute des pnj, des pieges, etc. Ça devient vite "un peu" chaud. :(

En C++, bah tu fais de l'héritage. Tu as en haut les EntiteAvecPV, réduite à un nom et une certaines quantité de PV, et de là héritent la classe Joueur (dont la méthode play() va lire les saisies au clavier) et la classe Monstre (dont la méthode play() va appeler la méthode privée maSuperIA()).

Et quand tu veux trier, tu mets tout dans vector<EntiteAvecPV> et tu appelles sort. Pouf. Tu veux afficher les noms à coté des PVs ? Les EntiteAvecPV contiennent ce nom donc c'est bon. En fait, le passage de Joueur/Monstre à EntiteAvecPV, c'est le filtre du "a." ci-dessus, sans cast (un Joueur *EST* une EntiteAvecPV, donc pas de cast !) ni aucun code à part excepté un simplissime = pour stocker ton objet dans le tableau à trier. :fete:

Et quand tu veux ajouter les PNJ ou les Piege ? Tu hérites à nouveau de EntiteAvecPV, et là encore le tri pourra se faire à l'aide d'un tableau d'EntiteAvecPV rempli à coup de =. :bave:

Voilà, c'est très long (comme d'hab avec ce genre de sujet), mais je pense que ça pourrait te donner une vision un peu plus claire. :)

JamereBurvelle
JamereBurvelle
Niveau 40
15 mai 2012 à 23:42:00

Wah, merci pour cette réponse, ça me permet de mieux voir les principaux intérêts, j'ai déjà remarqué qu'en C++ les pointeurs ont quasiment disparus (Les références c'est génial ! :bave: )

Pour l'héritage il faudrait que j'arrive à mieux maîtriser ça, ça semble vraiment super pratique !

Vous auriez pas des exercices qui demandent de créer des petits programmes utilisant des classes ? Pour débutants ?

chris_27
chris_27
Niveau 10
15 mai 2012 à 23:58:22

La seule source que "j'ai" sont les slides de cours + feuilles de TD d'un de mes collègues : http://perso.univ-perp.fr/guillaume.revy/index.php?page=teaching&amp;lang=fr :d) Programmation Orientée Objet (L3, semestre 1)

Après, je ne sais pas à quel point c'est abouti ni si c'est abordable pour un débutant. Normalement, le seul vrai prérequis c'est "niveau moyen en C" donc ça pourrait le faire pour toi. :-)

JamereBurvelle
JamereBurvelle
Niveau 40
16 mai 2012 à 00:20:21

Ok, je regarderai ça, merci beaucoup !

tbop2
tbop2
Niveau 10
16 mai 2012 à 11:25:52

+40 000 pour Chris_27 meme si je me reconnais moi-meme un serial-classer (bon nouvelle generation C# et Java un peu oblige).

JamereBurvelle ton post me rappelle cela dit le troisieme post qu'on a eu en moins d'un mois concernant le ou la fonctionnalite d'un langage qui commence toujours par : "bon j'ai lu le tuto du SDZ et j'ai tout compris par contre je comprends pas vraiment en quoi c'est utile". (A quand la meme question pour un tuto entier ahah ?)

La conclusion qui arrive vite au gres des postes et que malheureusement l'OP a lu trop rapidemment, n'a finalement rien compris a ce qu'il lisait contrairement a ses dires et au lieu de faire preuve d'un peu de jugeotte en relisant et en pratiquant le dit chapitre il va poster sur un autre forum "j'ai tout compris mais par contre ca sert a rien on est d'accord ?".

Ne vois pas de mal a ma remarqe mais quel que soit le site que tu utilises (par pitie pas le SDZ pour le C++) il faut que tu sois tres autodidactes et que tu ailles toujours plus loin que les exercices types donnees, il faut que tu developpes ton instant de curiosite, d'imagination et donc de resolution des problemes.... Parce qu'imaginer les problemes c'est deja un pas de plus pour savoir comment les resoudre :ok:

En te souhaitant bonne continuation et bienvenu sur ce forum si tel etait ton premier post.

chris_27
chris_27
Niveau 10
16 mai 2012 à 20:33:11

Ne pas comprendre le contenu scientifique d'un "cours" sur le site du zéro, c'est le comportement le plus normal qu'il soit. Ces "cours" sont faits dans une optique de vulgarisation, et par des gens qui n'ont en général pas le recul nécessaire pour se lancer dans cet exercice. :(

Du coup, ça donne une quantité d'informations pêle-mêle plus ou moins justes, assaisonnées d'exercices triviaux dont le seul but est de rassurer le lecteur. Hors, ce qu'il faut, c'est un cours avec une structure mûrement réfléchie, et qui propose de vrais problèmes sur lesquel le lecteur va bûcher pour pouvoir progresser. :(

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment