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 amie d'une classe abstraite


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 amie d'une classe abstraite
    Bonjour à tous

    Est ce qu'une classe peut etre amie d'une classe abstraite?

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Il me semble oui. Je vois pas pourquoi ça ne serait pas bon.
    Cependant l'intérêt en serait limité.

    Ca gâche le polymorphisme. Tu peux expliquer le contexte succintement ?

  3. #3
    Membre confirmé Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Par défaut
    J'imagine que c'est pour obtenir une classe amie de toutes les classe dérivées... ?

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Bah ça ne marchera pas. Une classe A est amie de B, pas de ses filles, si je ne m'abuse.

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Au temps pour moi, j'ai eu tord...
    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
    38
    39
    #include <iostream>
     
    using namespace std;
    class C;
    class B;
     
    class A
    {
    	friend class B;
    	int a;
     
    	public:
    	virtual void f() = 0;
    };
     
    class C : public A
    {
    	public:
    	void f() { }
    };
     
    class B
    {
    	C inst;
    	public:
    	void f(int n)
    	{
    		inst.a = n;
    		cout << inst.a << endl;
    	}
    };
     
     
    int main()
    {
    	B b;
    	b.f(1);
    	return 0;
    }
    Aucun problème avec ce code...

  6. #6
    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
    Et bien en fait j'ai plusieurs classe manager : CSpriteManager qui affiche les sprite, CCameraManager qui gère les différentes caméra, CTextureManager pour les textures, et toutes ces classes ont une méthodes Render(laFenetreCible) : ces manager héritent tous de IManagerRenderer qui possède une méthode virtuelle pure Render(laFenetreCible).
    Cependant ce n'est pas à l'utilisateur d'appeller chacune de ces méthodes, parce si j'ai 10 manager comme ceux la ça devient vite fastidieux donc j'ai mis ces méthodes en privées.
    J'ai ensuite créé une classe CRenderer qui va se charger d'appeller les méthodes Render de tous ces managers à la place de l'utilisateur. Cette classe contient un vecteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<IManagerRenderer*> m_vManager;
    Puis elle contient aussi une méthode RenderToScreen(laFenetreCible)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CRenderer::Render(sf::RenderWindow *pWindow)
    {
    	for(m_vManagerIter = m_vManager.begin(); m_vManagerIter != m_vManager.end(); ++m_vManagerIter)
    		(*m_vManagerIter)->Render(pWindow);
    }
    Mais comme vous le voyez cette méthode doit accéder aux méthodes Render de chaque manager (qui sont aussi de type IManagerRender puisqu'ils en héritent) qui sont en privées (pour ne pas que l'utilisateur y accède). Donc pour que mon CRenderer accède à ces méthodes privées, je souhaite qu'il soit ami de IManagerRender pour accéder à la méthode Render de cette classe et donc à toutes les méthodes Render de tous les managers qui héritent de IManagerRender.

    J'espère avoir était clair, mais c'est pas facile à expliquer^^

  7. #7
    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
    Mais à quoi ça sert de mettre class IManagerRender alors que l'on inclus IManagerRender.h parce si j'enlève class IManagerRender mon compilateur me sort environ 300 erreurs

  8. #8
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Tu mets
    dans crenderer.h
    Cela signifie, en gros : "il existe une classe IManagerRender mais elle est définie soit plus loin dans ce fichier soit dans un autre fichier". Cela ne donne aucun détail sur les fonctions membres et attributs, entre autres.

    Dans ton .cpp, tu as besoin de connaître les fonctions membres publiques de cette classe car tu les appelles! Il faut connaître donc leur prototype par exemple. Et ces informations, on les a lorsque l'on inclut le fichier d'en-tête de IManagerRender.

  9. #9
    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
    ok merci beaucoup Alp et tous les autres bien sûr ^^

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/09/2012, 14h58
  2. Réponses: 3
    Dernier message: 14/07/2012, 19h39
  3. Réponses: 2
    Dernier message: 02/02/2008, 07h37
  4. Réponses: 8
    Dernier message: 20/07/2007, 14h28
  5. fonction membre d'une classe amie d'une autre classe
    Par olive_le_malin dans le forum C++
    Réponses: 3
    Dernier message: 16/11/2006, 09h39

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