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 :

Classe abstraite


Sujet :

C++

  1. #1
    Membre confirmé Avatar de trecks
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 91
    Par défaut Classe abstraite
    Est-ce qu'une classe peut etre une classe amie d'une classe abstraite?

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    L'amitié semble convenir ici.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre confirmé Avatar de trecks
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 91
    Par défaut
    Oui mais je peux pas faire un friend dans la classe CRenderer pour chaque Manager, parce que ce n'est pas modulaire, sinon à chaque fois que je souhaite ajouter un manager de rendu je suis obligé de rajouter un friend dans la classe CRenderer mais merci quand même

    Est-ce que je peux utiliser l'héritage privé c'est à dire que ma classe IManager implémente la méthode Render(laFenêtreCible) en public et les managers héritent de façon privé de cette classe IManager comme ça l'utilisateur n'a pas accès à Render(...) mais par contre dans ma classe CRenderer vu que le vecteur contient des IManager* il pourra lui accéder aux Render des managers par l'intermédiaire de la méthode Render présente en public dans la classe IManager.

    Est-ce possible?

  4. #4
    Membre confirmé Avatar de trecks
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 91
    Par défaut
    Bon finalement j'ai abandonné l'héritage privée. Un bout de code pour vous faire plaisir^^

    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
     
    #ifndef __IManagerRender_h__
    #define __IManagerRender_h__
     
    #include <iostream>
    #include <SFML/Graphics.hpp>
     
    namespace SLE
    {
    	class IManagerRender
    	{
    	public:
    		IManagerRender(){}
    		virtual ~IManagerRender(){}
     
    		virtual void RenderToScreen(sf::RenderWindow *pWindow) = 0;
    	};
    }
     
    #endif
    Ici RenderToScreen est public et dans ma classe fille il est redéfini en privé

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #ifndef __CSpriteManager_h__
    #define __CSpriteManager_h__
     
    #include <iostream>
    #include <vector>
    #include <SFML/Graphics.hpp>
    #include "CSingleton.h"
    #include "CSprite.h"
    #include "IManagerRender.h"
     
    namespace SLE
    {
    	class CSpriteManager : public IManagerRender, public CSingleton<CSpriteManager> 
        {
            friend class CSingleton<CSpriteManager>;
     
        public:
            //Enregistre un sprite
            void RegisterSprite(CSprite *pSprite);
     
            //Supprime un sprite du conteneur
            void DeleteSprite(CSprite *pSprite);
     
        private:
    	void RenderToScreen(sf::RenderWindow *pWindow);
     
            CSpriteManager();
            virtual ~CSpriteManager();
     
            typedef std::vector<CSprite*> m_Vector;
            m_Vector m_vSprite;    //Vecteur des sprites
            m_Vector::iterator m_vSpriteIter;    //Itérateur de parcours du vecteur
        };
    }
     
    #endif
    Du coup dans le Renderer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void CRenderer::RegisterManagerToRendering(IManagerRender *pManager)
    {
    	if(pManager)
    		m_vManager.push_back(pManager);
    }
     
    void CRenderer::Render(sf::RenderWindow *pWindow)
    {
    	for(m_vManagerIter = m_vManager.begin(); m_vManagerIter != m_vManager.end(); ++m_vManagerIter)
    	{
    		(*m_vManagerIter)->RenderToScreen(pWindow);
    	}
    }
    Je peux accéder à la méthode RenderToScreen du SpriteManager grâce à la classe IManagerRender mais dans le main l'utilisateur lui ne peut y accéder

    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
    29
    30
    31
    32
     
    #include <iostream>
    #include "SLE.h"
     
    using namespace SLE;
    using namespace Audio;
     
    int main(int argc, char **argv)
    {
    	CSLEngine *pSLE = CSLEngine::GetInstance();
    	pSLE->InitEngine(768, 576);
     
    	CRenderer *pRenderer = CRenderer::GetInstance();
     
    	CSpriteManager *pSpriteManager = CSpriteManager::GetInstance();
            pRenderer->RegisterManagerToRendering(pSpriteManager);
     
    	CSprite *pRabbit = new CSprite("Data/Image/rabbit.png", 0.0f, 0.0f, 0);
    	pSpriteManager->RegisterSprite(pRabbit);
     
    	while(pSLE->IsRunning())
    	{
    	        pSLE->ActivateVerticaleSync(true);
    		pSLE->BeginScene();
    		pSLE->OnEvent();
    		pRenderer->Render(pSLE->GetVideoMode());
    		pSLE->EndScene();
    	}
    	pSLE->StopEngine();
     
    	return EXIT_SUCCESS;
    }
    Et tout marche comme sous des roulettes ^^

    Par contre je voudrais savoir si ce que j'ai fait respecte les principes de l'objet, et si non, y'a t'il une autre technique ?

Discussions similaires

  1. [Debutant] Une classe abstraite en parametre ?
    Par kiroukou dans le forum Débuter
    Réponses: 8
    Dernier message: 03/02/2005, 15h05
  2. [Débutant(e)] toString + classes abstraites
    Par debdev dans le forum Langage
    Réponses: 9
    Dernier message: 26/01/2005, 15h22
  3. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02
  4. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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