Bonjour à tous
Est ce qu'une classe peut etre amie d'une classe abstraite?
Bonjour à tous
Est ce qu'une classe peut etre amie d'une classe abstraite?
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 ?
Mon blog anglais - Mes articles et critiques de livres - FAQ C++0x, avec liste des nouveautés - Conseils sur le C++ - La meilleure FAQ du monde - Avant de créer des classes que vous réutiliserez, regardez si ça n'existe pas déjà - Le site du comité de normalisation du C++
Le guide pour bien débuter en C++ - Cours et tutoriels pour apprendre C++
J'imagine que c'est pour obtenir une classe amie de toutes les classe dérivées... ?
Bah ça ne marchera pas. Une classe A est amie de B, pas de ses filles, si je ne m'abuse.
Mon blog anglais - Mes articles et critiques de livres - FAQ C++0x, avec liste des nouveautés - Conseils sur le C++ - La meilleure FAQ du monde - Avant de créer des classes que vous réutiliserez, regardez si ça n'existe pas déjà - Le site du comité de normalisation du C++
Le guide pour bien débuter en C++ - Cours et tutoriels pour apprendre C++
Au temps pour moi, j'ai eu tord...
Aucun problème avec ce code...
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; }
Mon blog anglais - Mes articles et critiques de livres - FAQ C++0x, avec liste des nouveautés - Conseils sur le C++ - La meilleure FAQ du monde - Avant de créer des classes que vous réutiliserez, regardez si ça n'existe pas déjà - Le site du comité de normalisation du C++
Le guide pour bien débuter en C++ - Cours et tutoriels pour apprendre C++
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
Puis elle contient aussi une méthode RenderToScreen(laFenetreCible)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::vector<IManagerRenderer*> m_vManager;
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.
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); }
J'espère avoir était clair, mais c'est pas facile à expliquer^^
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
Tu mets
dans crenderer.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part class IManagerRender;
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.
Mon blog anglais - Mes articles et critiques de livres - FAQ C++0x, avec liste des nouveautés - Conseils sur le C++ - La meilleure FAQ du monde - Avant de créer des classes que vous réutiliserez, regardez si ça n'existe pas déjà - Le site du comité de normalisation du C++
Le guide pour bien débuter en C++ - Cours et tutoriels pour apprendre C++
ok merci beaucoup Alp et tous les autres bien sûr ^^
Partager