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 :

Héritage et Architecture d'un projet.


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Par défaut Héritage et Architecture d'un projet.
    Bonjour,

    Je suis débutant en C++ et je suis confronté à quelques problèmes / questions :

    Je m'entraine en travaillant sur un projet de jeu-vidéo et son architecture.
    Après avoir réfléchis à pas mal de chose, je passe à la pratique, voici donc l'architecture retenu ( Je me suis aidé du tutoriel sur l'architecture d'un jeu-vidéo et de quelques projets trouvés sur internet ) :



    Premier problème :
    Si je souhaite crée un objet de type bloc j'obtient l'erreur :
    error: field `bloc' has incomplete type
    J'ai conclu donc que le compilo n'aime pas la façon avec laquelle j'inclus mes fichiers :

    Object.hpp
    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
    21
    22
    23
    24
    25
    26
    27
     
    /* ---------------------------------------------------------------------
       (c) Hybrix 2007
     
       The standard object.
       --------------------------------------------------------------------- */
     
    #ifndef H_OBJECT
    #define H_OBJECT
     
    #include <iostream>
    #include "../math/Vector.hpp" // For physic engine
     
    class Bloc;
     
    class Object
    {
        public:
            // Constructor / Destructor.
            Object();
            ~Object();
     
        private:
          Bloc bloc;
    };
     
    #endif
    Et la classe qui en dérive :
    Bloc.hpp
    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
    21
    22
    23
    24
    25
     
    /* ---------------------------------------------------------------------
       (c) Hybrix 2007
     
       The standard object.
       --------------------------------------------------------------------- */
     
    #ifndef H_BLOC
    #define H_BLOC
     
    #include <iostream>
    #include "../Object.hpp"
     
    class Bloc : public Object
    {
        public:
            // Constructor / Destructor.
            Bloc();
            ~Bloc();
     
            // Move or apply physic on the bloc.
            Vector m_vector;
    };
     
    #endif
    J'ai testé différentes façon pour éviter l'erreur, mais aucune ne fonctionnes.
    La classe "Objects" me permet à la base de "rassembler"tous les objets ( la classe n'est pas complète, je fait seulement les bases pour le moment ).


    Second problème :
    Je vous en fait part dès que le premier sera résolu .


    Merci d'avoir pris le temps de me lire.
    Hybrix.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Salut,

    Ton attribut bloc déclaré dans la classe Object n'est ni une référence ni un pointeur mais un objet "direct". Il faut donc que son type ait été défini avant, en incluant le .h définissant ce type.

    Le problème dans ton cas est que Bloc dérive de Object, donc il te faudra que Object soit défini avant Bloc.

    De plus avec ce système, tu vas avoir un problème de construction infinie : lorsque tu construiras un object de type Bloc, le constructeur de la classe mère (Object) sera appelé, construisant un objet de type Bloc, appelant à son tour le constructeur de la classe mère etc ...

    Donc à mon avis il faut revoir le design, si tu veux pouvoir regrouper tous les objets, pourquoi ne pas créer une classe supplémentaire contenant par exemple une liste d'Object* ? Ou si tu as besoin d'utiliser ce rassemblement d'Objects et un Object seul, peut être que le Pattern Composite serait adapté.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Par défaut
    Merci d'avoir répondu,

    Sur l'exemple, je me suis trompé, l'objet de type bloc n'est pas dans la classe mère "Object", mais dans le "GameEngine", il n'y a donc pas de problèmes construction infinie.

    Je ne voit toujours pas comment faire alors que c'est un simple problème d'inclusion de fichiers .hpp.

    Je peut très bien dans la classe "GameEngine.hpp" ( Ou je crée un objet "Bloc" )
    inclure directement " Bloc.hpp", ça fonctionnera, mais je veut éviter d'inclure tout les objets un par un dans la classe GameEngine.

  4. #4
    Membre éclairé Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Citation Envoyé par Hybrix Voir le message
    Merci d'avoir répondu,

    Sur l'exemple, je me suis trompé, l'objet de type bloc n'est pas dans la classe mère "Object", mais dans le "GameEngine", il n'y a donc pas de problèmes construction infinie.

    Je ne voit toujours pas comment faire alors que c'est un simple problème d'inclusion de fichiers .hpp.

    Je peut très bien dans la classe "GameEngine.hpp" ( Ou je crée un objet "Bloc" )
    inclure directement " Bloc.hpp", ça fonctionnera, mais je veut éviter d'inclure tout les objets un par un dans la classe GameEngine.
    Vous pourriez utiliser un "pImpl", avec une classe cachée comme ça:

    GameEngine.hpp:
    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
     
    class Impl;
     
    class GameEngine
    {
    public:
      GameEngine();
      virtual ~GameEngine();
    ...
      void methodeA( int a );
     
    private:
      Impl *pImpl;
    ...
    };
    GameEngine.cpp
    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
    21
    22
    23
    24
    25
    26
     
    #include "bloc.h"
     
    class Impl
    {
    public:
      void methodeA( int a );
    ...
      Bloc bloc;
    ...
    };
     
    GameEngine::GameEngine()
      : pImpl( new Impl() )
    {
    }
     
    GameEngine::~GameEngine()
    {
      delete pImpl;
    }
     
    void GameEngine::methodeA( int a )
    {
      pImpl->methodeA( a );
    }
    Chaque methode de GameEngine sera comme methodeA().

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Par défaut
    Merci, mais je trouve que ça fait un peu trop pour un problème de fichier d'en tête.

    Je pense que je vais finalement devoir inclure tout les fichiers d'en tête de chaque objets dans le fichier d'en tête du GameEngine.

    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
    21
    22
    23
    24
    25
    26
    27
    28
     
    /* ---------------------------------------------------------------------
       (c) Hybrix 2007
     
       The game engine.
           - Worlds and maps are here .
           - IA monsters.
           - ... .
       --------------------------------------------------------------------- */
     
    #ifndef H_GAMEENGINE
    #define H_GAMEENGINE
     
    #include <iostream>
    #include <vector>
    #include "../base/Game.hpp"
    #include "../base/Engine.hpp"
    #include "../objects/Object.hpp"
     
    // Tout les objets ici
    #include "../objects/blocs/Bloc.hpp"
     
    class GameEngine : public Engine
    {
          ( ... )
    };
     
    #endif
    Ce que je souhaitait faire, de façon à ce que ça soit plus clair, c'est d'inclure tout les fichiers d'en tête dans "Objet.hpp" pour eviter d'emcombrer le fichier "GameEngine.hpp".

    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
    21
    22
    23
    24
    25
     
    /* ---------------------------------------------------------------------
       (c) Hybrix 2007
     
       The standard object.
       --------------------------------------------------------------------- */
     
    #ifndef H_OBJECT
    #define H_OBJECT
     
    #include <iostream>
    #include "../math/Vector.hpp"
     
    // Mettre tous les objets ici.
    class Bloc;
     
    class Object
    {
        public:
            // Constructor / Destructor.
            Object();
            ~Object();
    };
     
    #endif
    EDIT:
    Finalement j'ai trouvé une méthode plus propre et simple à mettre en place, j'ai crée un fichier "Object_list.hpp" dans lequel j'inclus tous les objets.
    Il suffit ensuite d'inclure ce fichier dans la classe "GameEngine.hpp".

    Merci à vous ( Je laisse le topic en nom résolu,car j'aurais d'autre questions )

Discussions similaires

  1. Conseil sur l'architecture de mon projet
    Par Goffer dans le forum Flex
    Réponses: 2
    Dernier message: 17/07/2009, 11h27
  2. Réponses: 0
    Dernier message: 01/12/2008, 15h44
  3. Héritage, lib, Solutions avec multiples projets
    Par Ikit dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 22/04/2008, 12h01
  4. Architecture d'un projet décisionnel
    Par markoBasa dans le forum Approche théorique du décisionnel
    Réponses: 7
    Dernier message: 21/04/2008, 11h21
  5. Choix d'une architecture pour un projet
    Par rveber dans le forum Windows
    Réponses: 5
    Dernier message: 30/01/2008, 21h44

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