Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité de passage
    Inscrit en
    mai 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : mai 2012
    Messages : 6
    Points : 4
    Points
    4

    Par défaut 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

  2. #2
    Invité de passage
    Inscrit en
    mai 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : mai 2012
    Messages : 6
    Points : 4
    Points
    4

    Par défaut

    Il est en réalité impossible de faire une déclaration anticipé pour un ref_ptr, lors d'une référence cyclique, dans ce cas les smart pointer sont tout simplement inutilisable.

    Merci à vous.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •