Rebonjour,
J'ai détaillé mon problème dans le post précédent. Je n'ai plus eu de problème de compilation jusqu'au moment où j'ai commencé à implémentr d'autres classes.
Le problème précédent a été résolu en gérant les inclusions cyclique
J'ai de nouveau des problèmes de référence cyclique avec mes nouvelles classes. J'ai donc résolu le problème en faisant attention aux inclusions. Les smart pointer (de nouveau) me complique la vie une nouvelle fois.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 class Block; class Map : public Referenced{
je vous présente le 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 //Viewer.h #ifndef _VIEWER_H_ #define _VIEWER_H_ #pragma once #include <osg/Array> #include <osg/Geode> using namespace osg; class EventController; class UpdateController; class Viewer : public osg::Referenced{ private : ref_ptr<EventController> eController; ref_ptr<UpdateController> uController; int longueur, largeur; public : Viewer(ref_ptr<EventController> eController, ref_ptr<UpdateController> uController, int longueur, int largeur){ this->eController = eController; this->uController = uController; this->longueur = longueur; this->largeur = largeur; }; void addElement(int, int, int); void initClose(); protected : ~Viewer(); }; #endif
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 // Model.h #ifndef _MODEL_H_ #define _MODEL_H_ #pragma once #include<osg/Array> #include "Viewer.h" #include "EventController.h" #include "UpdateController.h" using namespace osg; class Model : public osg::Referenced { private: osg::ref_ptr<Viewer> view; public: Model(){ view = new Viewer(new EventController(this),new UpdateController(this),7,7); } int getTranslation(int); void buttonMove(int); }; #endif
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 //UpdateController.h #ifndef _UPDATECONTROLLER_H_ #define _UPDATECONTROLLER_H_ #pragma once #include<osg/NodeCallback> #include<osg/Array> #include <osg/MatrixTransform> using namespace osg; class Model; class UpdateController : public NodeCallback { private: osg::ref_ptr<Model> model; public : UpdateController(osg::ref_ptr<Model> model){ this->model = model; } virtual void operator()(Node* node, NodeVisitor* nv); protected : ~UpdateController(); }; #endif
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 // EventController.h #ifndef _EVENTCONTROLLER_H_ #define _EVENTCONTROLLER_H_ #pragma once #include <osgGA/GUIEventAdapter> #include <osgGA/EventVisitor> using namespace osg; using namespace osgGA; class Model; class EventController :public NodeCallback { private : osg::ref_ptr<Model> model; public: EventController(osg::ref_ptr<Model> model){ this->model = model; } // C'est l'opérateur ci-dessous, hérité de NodeCallback, qui doit être redéfini // afin de gérer des évènements liés à un Node dans le cadre du parcours d'un NodeVisitor virtual void operator()(Node* node, NodeVisitor* nv); //~EventController(); }; #endif
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //Viewer.cpp #include "Viewer.h" void Viewer::addElement(int i, int j, int id){ } void Viewer::initClose(){ }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 //UpdateController.cpp #include "UpdateController.h" #include "Model.h" // AngleUpdater.cpp void UpdateController::operator()(Node* node, NodeVisitor* nv) { system("echo hello"); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 // EventController.cpp #include "EventController.h" #include "Model.h" //#include <iostream> void EventController::operator()(Node* node, NodeVisitor* nv) { }l'erreur à la compilation est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 // Model.cpp #include "Model.h" int Model::getTranslation(int id){ return 1; } void Model::buttonMove(int direction){ }
J'ai un peu du mal à comprendre ce message d'erreur peut-être le fait que la définition class EventController; n'étend pas osg::Referenced ce qui empêche d'utiliser un smart pointer et la compilation ?!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 1> Viewer.cpp 1>c:\progs\openscenegraph\include\osg\ref_ptr(35): error C2027: utilisation du type non défini 'EventController' 1> c:\users\bibi\documents\visual studio 2010\projects\sokoban\sokobanosg\viewer.h(10)*: voir la déclaration de 'EventController' 1> c:\progs\openscenegraph\include\osg\ref_ptr(35)*: lors de la compilation de la fonction membre 'osg::ref_ptr<T>::~ref_ptr(void)' de la classe modèle 1> with 1> [ 1> T=EventController 1> ] 1> c:\users\bibi\documents\visual studio 2010\projects\sokoban\sokobanosg\viewer.h(15)*: voir la référence à l'instanciation de la classe modèle 'osg::ref_ptr<T>' en cours de compilation 1> with 1> [ 1> T=EventController 1> ] 1>c:\progs\openscenegraph\include\osg\ref_ptr(35): error C2227: la partie gauche de '->unref' doit pointer vers un type class/struct/union/génériquee
Mon nombre de classe va commencer à s'agrandir exponentiellement et je n'arrive pas à trouver un bonne façon de faire pour éviter cette inclusion cyclique.
Je fais juste attention à toujours déclarer class XXX; lorsque le YYY.h n'utilise aucune propriété de l'objet à implémenté (je parle de méthode, constructeur, ...) et j'inclus le XXX.h dans le YYY.cpp
Cependant dans ce cas ci l'utilisation du smart pointer ne favorise pas la compilation.
Je me demande à ce stade s'il y a moyen de contourner ce problème où si la conception est à revoir ?
Merci bien à vous
Partager