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

[c++] Question de Poo

chris_27
chris_27
Niveau 10
24 février 2012 à 20:03:22

Il y a un autre cas d'école où tu dois utiliser les pointeurs : lorsqu'on utilise des classes abstraites pures. Là, on ne peut pas créer d'objet correspondant à la classe abstraite pure, et donc il faut passer par des pointeurs.

Exemple : reprenons l'histoire de la fenêtre. Ta fenêtre, c'est moralement une liste des Chose de afficher, la Chose pouvant être un Bouton, un pavé de Texte, une Image, un Containeur servant à organiser le positionnement de choses qu'il contient, etc. Tu ne peux pas stocker dans une même liste un objet de type Bouton et un objet de type Image (on ne mélange pas les serviettes et les torchons, pardi !)
On s'en sort par exemple en faisant comme suit :

class Chose
{
  public:
    virtual ~Chose() {}
    virutal void draw() const =0;
};
// NB: pas de constructeur pour Chose, car de toute façon on
// ne peut pas créer de Chose, seulement des Chose* à cause du "=0"

class Bouton : public Chose
{
  private:
    std::string text;
  public:
    Bouton(string s) : text(s) {}
    void draw() const { ... }
};

Puis pour la fenêtre, on va définir une
    std::list<Chose*> l;
sur laquelle on pourra faire un
    l.push_back(new Bouton("toto"));
pour ajouter un bouton à la fenêtre.

PS: avec un peu de chance, j'ai pas trop merdé niveau syntaxe. :peur:

tbop2
tbop2
Niveau 10
24 février 2012 à 20:30:47

T'utilises peut-être ça au boulot parce que les gars viennent peut-être du Java est adore mettre des new partout parce que cela leur rappelle le bon temps....

Ou peut-être parce qu'ils ont effectivement une bonne raison de le faire. Mais "on fait des pointeurs dès que l'on instantie une classe" est tout sauf une bonne raison (mis à part celle qui veuille que l'on se complique la vie peut-être....). :)

Pseudo supprimé
Pseudo supprimé 24 février 2012 à 20:31:40

On joue beaucoup avec les classes abstraites pures. C'est peut être a cause de ça. On a quasiment que ça.

chris_27
chris_27
Niveau 10
24 février 2012 à 20:53:29

Le problème vient peut-être de là. Mon avis sur les classes abstraites pures est que c'est un poison, pas une fonctionnalité du langage C++.

Pseudo supprimé
Pseudo supprimé 24 février 2012 à 20:56:22

Non ça par contre je comprends très bien leur interet: La segmentation et la spécialisation. Si par exemple tu fais un SDK qui gère un rendu, tu as pas envie de gerer le scene graph avec, donc tu fais juste les classes abstraites et tu laisse l'autre gars gerer les objets. Ca marche dans plein plein d'applis comme ça.

Pseudo supprimé
Pseudo supprimé 24 février 2012 à 21:20:42

PS d'ailleurs on s'est planté tout les deux: Classe abstraites, méthodes virtuelles pures. "Abstraite pure" je crois bien que c'est un abus de langage.

chris_27
chris_27
Niveau 10
24 février 2012 à 21:40:33

« Non ça par contre je comprends très bien leur interet: La segmentation et la spécialisation. » :d) laisse moi réfléchir... non, ce n'est pas ça que ça apporte les classes virtuelles pures (et en fait, je ne suis pas bien sûr que le "pur" apportent vraiment en expressivité).

Pseudo supprimé
Pseudo supprimé 24 février 2012 à 21:45:49

La va falloir que tu développe un peu :doute:

chris_27
chris_27
Niveau 10
24 février 2012 à 21:46:31

Et non, moi je ne me suis pas planté. Et j'ai bien donné un exemple de classe abstraite pure, en insistant bien sur la présence d'une méthode définie avec un "=0" (c'est de là que vient le "pur").

Une classe virtuelle, c'est n'importe quelle classe avec une méthode virtuelle (taguée avec le mot clé virtual). Mais on peut très bien faire une classe "juste" virtuelle, en définissant du code par défaut pour les méthodes virtuelles, qui sera potentiellement remplacé à l'héritage (par opposition au "=0" qui signifie qu'on ne donne pas de code et que c'est systématiquement aux classes dérivées de le faire).

Et je maintiens ma remarque précédente, ce n'est pas clair que le coté pur apportent de l'expressivité au C++. Ça allège un peu la syntaxe quand on veut du polymorphisme (enfin, au prix de new/delete puisqu'il faut passer par des pointeurs), mais je ne vois pas plus que ça.

chris_27
chris_27
Niveau 10
24 février 2012 à 21:59:16

PS: on devrait peut-être poursuivre sur un autre thread, parce que là on s'éloigne méchamment du sujet initiale, et je pense que ça dépasse de loin les compétences actuelles de l'OP.

Pseudo supprimé
Pseudo supprimé 24 février 2012 à 22:04:14

Si, je te dis que classe abstraite = abstraite pure, c'est un abus de langage. Une classe abstraite contient des méthodes virtuelles pures, mais on ne dit pas "abstraite pure" c'est ce que je voulais dire.

Quand a ton paragraphe sur la classe virtuelle, oui, oui, pas de souci de ce coté là.

Et par rapport a ça, non en effet niveau expressivité ça apporte pas forcéement quelque chose, mais au niveau sécurité et séparation pour moi c'est clair que c'est important.

Par exemple comment tu veux faire faire une implémentation par quelqu'un sans classe abstraite?

Pseudo supprimé
Pseudo supprimé 24 février 2012 à 22:07:03

Et sinon oui je suis d'accord, on devrait parler de ça ailleurs, le gars du début doit être un paumé lol

godrik
godrik
Niveau 30
24 février 2012 à 22:18:24

"Et je maintiens ma remarque précédente, ce n'est pas clair que le coté pur apportent de l'expressivité au C++."

Ca permet principalement de faire l'equivalent des "interface" en java. En C++, il faut faire de l'heritage multiple pour arriver a un comportement similaire. Voir qu'une classe est virtuelle pure rassure le programmeur sur ce dont il s'agit.

chris_27
chris_27
Niveau 10
25 février 2012 à 00:23:47

Bon, je prends l'initiative de forker. La suite sur les classes abstraites, c'est ici : https://www.jeuxvideo.com/forums/1-47-61981-1-0-1-0-c-a-propos-des-classes-abstraites.htm

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