Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > Moteurs 3D > OpenSceneGraph
OpenSceneGraph Forum d'entraide pour le moteur 3D OpenSceneGraph
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/10/2012, 17h03   #1
zorglue
Invité de passage
 
Inscription : mai 2012
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2012
Messages : 6
Points : 3
Points : 3
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
zorglue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2012, 02h05   #2
zorglue
Invité de passage
 
Inscription : mai 2012
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2012
Messages : 6
Points : 3
Points : 3
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.
zorglue est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h00.


 
 
 
 
Partenaires

Hébergement Web