Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pointeur d'objet ou objet encapsulé ?

[Théorie] POO - Chap. 6 "Associez les classes et les pointeurs"

Sujet résolu
    31 juillet 2020 à 20:08:23

    La lecture du chapitre mentionné en sous-titre me pose question :

    Sur l'exemple du jeu David et Goliath (classes Personnage et Arme), la version d'avant le chapitre était :

    - L'objet Arme était un attribut du Personnage

    - Le chapitre dit qu'il existe une méthode + souple : faire pointer le Personnage vers une Arme, ce qui pose de problème de la destruction du Personnage, ce qui nécessite de détruire l'Arme avant... Tout cela est bien expliqué.

    Ce que je ne comprends pas c'est en quoi c'est plus "souple" ?

    Si l'Arme ne peut pas "survivre" au Personnage, alors pourquoi ne pas l'avoir laissée comme objet constitutif du Personnage, comme c'était fait dans la version d'avant ?

    Pourquoi ne pas avoir créé un "râtelier d'Armes" au niveau de l'applicatif (main.cpp dans ce cas) et chaque Personnage vient s'y servir (en pointant sur une Arme). Auquel cas, les armes auraient correspondu à des objets identifiés (i.e. d'adresse connue) et la destruction du Personnage ne posait pas de problème de "fuite de mémoire" ?

    Plus généralement : sur quels critères faut-il faire pointer un objet vers un autre plutôt que d'inclure l'objet dans l'autre (son possesseur) ? 

    • Partager sur Facebook
    • Partager sur Twitter
      1 août 2020 à 2:47:56

      Le cours de C++ d'OC est une calamité.

      Si vous vous posez de type de question, c'est bon signe, vous avez assez de recul pour comprendre qu'il n'est pas bon.

      Je vous conseille d'arrêter la lecture des cette horreur de cours et de vous rabattre sur le cours de C++ de Zeste de Savoir.

      >Tout cela est bien expliqué

      L'extrait que vous donnez n'est pas clair. Je suppute que la classe Personnage contient un champ de type pointeur sur Arme.

      C'est plus "souple" car l'arme du personnage peut changer au cours du temps, voire le personnage peut être désarmé.

      Votre question sur la durée de vie de l'arme est très pertinente et montre tout un pan des énormes bévues de ce cours.

      Dans le cas du loot, de l'achat d'arme, etc..., l'arme n'a pas à disparaître du "monde".

      Avec un cours de C++ moderne, cela ne serait pas un pointeur nu mais un unique_ptr pour renforcer qu'une arme n'a qu'un propriétaire et qu'on ne peut pas la clonée par inadvertance.

      Votre approche à base de "râtelier" est toute à fait pertinente. Ce n'est pas la seule manière de modéliser la chose. Il faut prendre celle qui simplifie le plus l'ensemble des choses à faire. (Pour les RPG, l'approche à base de classe POO attend rapidement ses limites et une approche ECS (Entity Component System) est plus efficace).

      Si vous voulez avoir un mécanisme qui permet d'avoir la liste des armes dans le monde, vous pouvez créer un objet "Gestionnaire des Armes" contenant un vecteur d'unique_ptr sur les armes. Les forgerons confiront la vie des armes qu'ils ont créées via le transfert de propriété de l'unique_ptr du forgeron sur l'arme vers le "gestionnaire des Armes". Le porteur de l'arme n'aura alors qu'un weak_ptr sur l'arme et ne sera plus en charge de la durée de vie de l'arme (qui pourra être looté à loisir, etc...).

      Le critère, c'est "quand cela rend les choses plus simple". Si vous voulez avoir la possibilité pour un "Personnage" de changer d'arme ou d'être désarmé, l'utilisation de pointeurs intelligents (et pas ces horreurs de pointeurs nus) permettent de facilement ces possibilités.

      Et gardez toujours un œil critique sur les mécanismes d'un langage pour les utiliser à bon escient.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

      Pointeur d'objet ou objet encapsulé ?

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown