osg::Smart pointer & inclusion cyclique
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
Code:
1 2
| class Block;
class Map : public Referenced{ |
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.
je vous présente le code :
Code:
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:
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:
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:
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:
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:
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:
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)
{
} |
Code:
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){
} |
l'erreur à la compilation est :
Code:
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 |
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 ?!
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