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 :

Pb de hierarchie de classe .


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut Pb de hierarchie de classe .
    Bonjour les jeunes !
    Je suis confronté a un probléme tout nouveau pour moi ... mais surement enfantin pour vous

    J'ai fureté ca et la pour voir si une solution n'était pas sous mes yeux ; je vois a peu prés vers quoi me tourner, mais trop de questions me taraudes encore pour parvenir a mes fins

    Voici mon probléme :

    Je posséde 2 classes: ( on les apellera A et B pour plus de simplicité )

    une classe A : cGraphicManager : dont le but est de charger en mémoire des texture ; je ne crérait qu'une seule instance de cette classe dans tout mon prog . ( nonon ce n'est pas un singleton ....c'est juste une classe toute bête :p ) .

    une classe B : cSprite, qui entre-autre a besoin de charger une texture lors de la création d'un objet de ce type

    Mon pb : je ne vois aps comment "lié" tout ca ... car je ne peut pas mettre un objet de type A dans ma classe B; car il n'exite qu'un seul objet de type A .

    Ce que j'aimerai faire : acceder aux méthodes de la classe A depuis la classe B ( la classe A posséde une methode load() ; et je voudrai pouvoir faire :

    B sprite("monsprite.jpg") ;
    sprite.load() ;

    Je pensait donc m'orienter vers la notion d'heritage ( que je connais que peu )
    et la 2 probléme :

    1) Est-on obligé de déclaré une classe fille dans le meme fihcier que la classe mére ? J'ai essayé de le faire dans 2 fichier séparé et j'ai une erreur a la compi ( il faut dire que ca vient peut-etre du fait que mes 2 fichier ne sont pas dans le même repertoire ....comment pallier a cela ? )

    2)Je vient de me rendre compte en écrivant ce post, que cette méthode n'est probablement pas la bonne . Car d'apres ce que j'ai lu, si je fait dérivé ma classe B de ma classe A ; en créant par la suite des instance de B c'est en faite des objet de type A qui seront basiquement crées; ors je veut UN seul objet de type A .....erreur donc !

    En dehors de ma question en 1 ), j'aimerai savoir si une solution est envisagable aux vue de mes données ou si il faut que je revoie mon systéme plus glogalement ? ( a ce sujet, si vous avez des conseils de "design" plus aproprié , je suis tout ouie !)

    Merci d'avance !

    edit: bon une solution + simple consiste a modifier un peu ma classe A pour que , au lieu de contenir toutes les texture de mon prog, elle n'en contienne qu'une ... comme ca aprés, il me suffit de placer un objet A comme menbre de ma classe B et c'est finit mais bon .....

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 63
    Par défaut
    Ce que j'aimerai faire : acceder aux méthodes de la classe A depuis la classe B ( la classe A posséde une methode load() ; et je voudrai pouvoir faire :

    B sprite("monsprite.jpg") ;
    sprite.load() ;
    Pour pouvoir faire ce genre de chose je vois que l'héritage et tu n'es pas obligé de déclarer les classes filles dans le même fichier que la classe mère et heureusement. Pour le problème de compile c'est surement parce que ce n'est pas dans le même dossier. Peut être qu'en rajoutant un lien vers le dossier avec l'option -L (si tu utilises gcc) ?

    Sinon, tu peux déclarer la fonction load static, tu pourras ensuites l'appeler sans qu'il n'y ait d'instance de la classe A.
    Tu peux aussi déclarer la classe A comme un singleton et là tu es assuré qu'il n'y aura qu'une seule instance de cette classe.
    Avec les deux méthodes il faudrait changer la fonction load en ajoutant par exemple un paramètre cSprite ou le nom de la texture.

    edit: bon une solution + simple consiste a modifier un peu ma classe A pour que , au lieu de contenir toutes les texture de mon prog, elle n'en contienne qu'une ... comme ca aprés, il me suffit de placer un objet A comme menbre de ma classe B et c'est finit mais bon .....
    Je suis pas sur que ça soit une bonne idée, alors oui ça résoudra facilement le problème mais imagine que tu doives charger 100 fois la même texture, avec cette méthode elle sera 100 fois en mémoire alors qu'une seule fois suffit.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Par défaut
    Si tu peux modifier la classe A comme tu veux alors en faire un singleton me semble pas mal

    apres tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void sprite::load(const std::string& filename)
    {
    ...
    cGraphicManager::instance().load(filename)
    ...
    }

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    INteresant : pour voir si j'ai bien piger :

    je fait de ma classe A un singleton ( ca , ca devrait être jouable vu le nbre de tuto dispo sur le net ^^ )
    ensuite dans ma classe B, je peut utiliser une methode apartenant a mon objet A ( singleton ) qui lui sera créer dans mon main par ex ?

    cGraphicManager::instance().load(filename)
    ---> je compte appelé ca dans le constructeur de ma classe B mais peu importe

    Et ce singleton je n'ai a le déclarer nul part dans mes .h et .cpp et ma classe B ? bizzare ... mais si ca marche comme ca, ca doit etre aussi l'utilité du singleton je supose ^^

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 63
    Par défaut
    je fait de ma classe A un singleton ( ca , ca devrait être jouable vu le nbre de tuto dispo sur le net ^^ )
    Regarde le tuto de loulou, il y a une classe pour gérer facilement les singletons, c'est mieux que d'avoir à le faire sur chaque classe qui doit être singleton (pas sûr d'avoir été très clair ).

    Et non ce singleton tu n'as pas à le déclarer, évidemment il faut les includes mais c'est tout, et pour le reste c'est exactement ça.
    En fait la fonction instance() renvoies l'unique instance de la classe et la crée si elle n'existe pas, enfin tu verras rapidement comment ça marche

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    Oki doki
    A ! il faut quand meme que j'"include" ma classe singleton je me disait bien aussi :p
    bon, merci a vous ! je reveint vous voir une fois le sujet potassé !

  7. #7
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Et ce singleton je n'ai a le déclarer nul part dans mes .h et .cpp et ma classe B ? bizzare ... mais si ca marche comme ca, ca doit etre aussi l'utilité du singleton je supose ^^
    Malheureusement si. Si une classe B ou C utilise la classe A, alors B ou C doit connaître A. Si tu veux te simplifier la vie tu peux effectuer juste la déclaration de la classe A avant la classe B:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class A;
     
    class B{
        ...
        ...
    };
     
    //ici les méthodes ou se trouvent les appals à A
    B::B(...){
        ...
        ...
    }
    //etc...
    Une autre méthode est d'utiliser un fichier d'en-tête unique au projet et qui est inclus en premier. Bien évidemment tous les autres fichiers feront référencent à cet en-tête.

  8. #8
    Membre éprouvé Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Par défaut
    Citation Envoyé par Elendil_BzH
    Regarde le tuto de loulou, il y a une classe pour gérer facilement les singletons
    j'ai vu qu'il y avait aussi l'explication du pattern singleton dans les tutos de Sébastien Méric.
    Tu peux le trouver en passant par la section UML

  9. #9
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    Je suis entrain de regarder de plus prés ce dont il s'agit et...c'est moi ou une erreur de frappe s'est glissé dans la faq c++ ?

    MonSingleton & s = Singleton::GetInstance();
    j'aurais plutot mis :

    Singleton & s = Singleton::GetInstance();

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 63
    Par défaut
    Apparemment c'est une erreur.

    Sinon dans la FAQ, c'est un exemple de classe singleton alors qu'avec le tuto de loulou on crée une classe mère singleton et on dérive toutes les classes qui seront des singletons, ça évite de réimplementer les mêmes fonctions à chaque fois si tu veux que plusieurs classes de singleton. C'est bien pratique quand tu commences a avoir 5-6 classes singletons et comme tu codes un jeu (je crois) on est vite arrivé à devoir gérer plusieurs classes singleton.

  11. #11
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    Je vais d'abbord essayer de comprendre bien le principe de singleton et quand j'en aurait fait 3-4 je jeterais un oeil a la solution de loulou
    merci

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut


    Effectivement le singleton est une bonne solution dès que tu dois gérer des gestionnaires. Tu peux aller voir mes explications ici.

    Pour la gestion des textures plus généralement de ton moteur graphique, tu peux aller jeter un oeil sur mes autres tutos

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par Clad3
    Je suis entrain de regarder de plus prés ce dont il s'agit et...c'est moi ou une erreur de frappe s'est glissé dans la faq c++ ?

    MonSingleton & s = Singleton::GetInstance();
    j'aurais plutot mis :

    Singleton & s = Singleton::GetInstance();
    Effectivement, on va corriger ça.


  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 63
    Par défaut
    Tant qu'on est sur les erreurs j'en ai trouvé une dans ton tuto loulou, la partie sur les singletons justement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <Singleton.h>
     
    class CTextureManager : public CSingleton<CTextureManager>
    {
        friend CSingleton<CTextureManager>;
     
        // ...
    };
    Si je fais ça j'ai une erreur à la compilation :

    error: déclaration amie requiert une clé de classes, i.e. «
    friend class Singleton<Renderer>'
    Il suffit juste de mettre le mot clé class et ça marche mais ça dépend peut-être des compilateurs (j'utilise g++).

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Bien vu !

    En effet c'est accepté par VC++, mais depuis que je compile sous DevC++ et BCB6 j'ai remarqué quelques petites erreurs de ce genre, ce sera corrigé merci.

Discussions similaires

  1. Hierarchie de classe
    Par Invité dans le forum Design Patterns
    Réponses: 4
    Dernier message: 13/11/2014, 13h25
  2. Hierarchie de classe pour Perl/Tk
    Par astrotouf dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 12/11/2007, 10h14
  3. [MFC] Hierarchie des classes MFC
    Par venomelektro dans le forum Visual C++
    Réponses: 2
    Dernier message: 20/03/2007, 16h27
  4. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  5. [Language]Hierarchie de classe unique c'est quoi ?
    Par Le Pharaon dans le forum Langage
    Réponses: 1
    Dernier message: 16/09/2005, 17h58

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