IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Comment reproduire un arbre de classes comme dans Unreal?


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1
    Par défaut Comment reproduire un arbre de classes comme dans Unreal?
    Bonjour,

    Après avoir étudié à peu près l'ensemble du moteur d'Unreal (Warfare, celui d'UT2003-2004 entre autres donc), je voudrais en reproduire certaines fonctionnalités.

    En particulier, ce qui semble d'une efficacité remarquable dans ce moteur c'est la possibilité d'avoir un arbre de classes qui "semble" se génerer automatiquement à la compilation de nouvelles classes. Ainsi si on crée une classe héritant de Actor en UnrealScript et qu'on compile avec Wotgreal, elle sera automatiquement ajoutée à l'arbre de classes.

    Idem, toujours en UnrealScript, si on appelle la fonction isA() d'une instance de classe xPawn (le diagramme d'héritage étant Actor <- Pawn <- xPawn) elle retourne vrai si on lui passe le nom de l'une de ces classes. Bref Unreal génère donc vraisemblablement une liste complète des héritage de chaque classe.

    La question est donc: comment générer cette liste des dépendances pour n'importe quelle classe afin de l'intégrer au final dans l'arbre de classes?

    * Si c'est à l'initialisation, en runtime:

    Il faudrait sans doute récupérer en runtime les noms des classes mères avec typeid() par récursion dans une fonction virtuelle qui viendrait remplir la liste de dépendances.
    Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    class Actor
    {
    protected:
      std::vector<string> _inheritedClassNames;
      virtual void recurse()
      {
      _inheritedClassNames.push_back( typeid(Actor).name() );
      }
    };
     
    class Pawn : public Actor
    {
    protected:
      void recurse()
      {
      Actor::recurse();
      _inheritedClassNames.push_back( typeid(Pawn).name() );
      }
    };
    Pour obtenir au final dans la classe xPawn une liste contenant "class Actor", "class Pawn", "class xPawn" ?

    Cette approche très très simplifiée marche évidemment mais est vraiment mauvaise car:
    - la génération des noms de classe, et donc celle du class tree se fait donc à l'initialisation des classes. Donc il faudrait créer au moins une instance de TOUTES les classes existantes pour que leur nom figure dans l'arbre! Pas très générique!
    - il y a un énorme problème de redondance, chaque instance de classe possède le même tableau! Il faudrait peut-être le passer en static.
    - mais si la liste est effectivement déclarée "static", même en utilisant des template pour automatiser l'overloading de la fonction recurse() pour chaque classe fille, l'automatisation est quand même cassée car il faut redéclarer ces fichus membres statiques dans le .cpp des classes filles.


    * Si c'est à la compilation:

    Aaah les joies de la métaprogrammation! J'ai vu dans l'article de Laurent Gomila sur les TypeList qu'il était possible d'effectuer des opérations telles que PushBack, Find sur ce type de structure.

    Pourrait-on envisager une typelist T qui contiendrait les types de classe en question?
    E.g., si on crée la classe xPawn, celle-ci auparavant déclarée typelist<Actor,Pawn> T, deviendrait typelist<Actor,Pawn,xPawn> avec un PushBack<xPawn,T> dans la déclaration de la classe?

    En fait tout cela reste très obscur pour moi! Il y a peut-être même beaucoup plus simple comme approche, j'attends vos commentaires

  2. #2
    Membre éclairé Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut
    Une idée me vien c'est peut être idiot : Mais un classe register avec une macro comme à la wxwidget. Ca pourrait peut être une solution.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    L'outil que tu cites, Wotgreal, ce serait pas une sorte de précompilateur élaboré pour ajouter de la réflexion, comme moc dans Qt?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Comment créer un graphique tout simple comme dans Excel
    Par damsmut dans le forum IHM
    Réponses: 15
    Dernier message: 29/08/2017, 22h58
  2. comment faire pour faire un treeview comme dans un setup?
    Par Theinfrarougegp dans le forum C#
    Réponses: 3
    Dernier message: 16/06/2015, 16h19
  3. Réponses: 6
    Dernier message: 07/10/2009, 11h17
  4. Réponses: 4
    Dernier message: 19/04/2007, 20h13
  5. [DAO] Comment gérer les liens avec la bdd dans mes classes?
    Par Wormus dans le forum Autres
    Réponses: 6
    Dernier message: 22/02/2006, 16h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo