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

OpenSceneGraph Discussion :

osg::Smart pointer & inclusion cyclique


Sujet :

OpenSceneGraph

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Points : 7
    Points
    7
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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)
    {
     
    }
    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){
     
    }
    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
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Points : 7
    Points
    7
    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.

Discussions similaires

  1. osg::Smart pointer & Héritage
    Par zorglue dans le forum OpenSceneGraph
    Réponses: 2
    Dernier message: 20/10/2012, 15h13
  2. Boost & smart pointers
    Par Goduak dans le forum Boost
    Réponses: 5
    Dernier message: 28/02/2008, 10h41
  3. Smart Pointer
    Par Fry dans le forum C++
    Réponses: 5
    Dernier message: 03/10/2005, 23h13
  4. Utilisation des smart pointer
    Par 0xYg3n3 dans le forum MFC
    Réponses: 11
    Dernier message: 22/04/2005, 18h37
  5. templates et smart pointers
    Par delire8 dans le forum C++
    Réponses: 9
    Dernier message: 10/07/2003, 16h26

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