Bonjour,
je débute en programmation C++ et en programmation graphique avec osg.
Je me force à utiliser des smart point (osg::ref_ptr<T>) pour mes pointeurs, et j'obtiens pas mal d'erreur.
J'ai du mal à trouver de la documentation sur internet à ce sujet. Tout ce que j'ai pu trouver et qui m'a aidé jusqu'ici est :
http://andesengineering.com/OSG_Prod...fPointers.html
Je présente mon problème :
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 //Map.h #pragma once #include <osg/Array> #include "Block.h" using namespace osg; class Map : public Referenced{ private: //ref_ptr<Block> [][]; int longueur, largeur; //taille de la map public: Map(int longueur, int largeur){ this->longueur = longueur; this->largeur = largeur; } //Cette méthode déplace le block dans la structure de données de la Map de x,y en mX,mY virtual void moveBlock(int x, int y, int mX, int mY); //Cette méthode renvoie le block en coordonnées mX,mY ou NULL s'il n'y en a pas. virtual ref_ptr<Block> hasFreePlace(int mX, int mY); };J'ai encore d'autres fichiers et beaucoup d'erreur à la compilation mais je pense que la source du problème se trouve ici
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 //Map.cpp #include "Map.h" #include "Block.h" #include "Caisse.h" #include <osg/Array> using namespace osg; ref_ptr<Block> Map::hasFreePlace(int mX, int mY){ ref_ptr<Map> map = new Map(5,2); ref_ptr<Block> block = new Caisse(map,4,3); return block; } void Map::moveBlock(int x, int y, int mX, int mY){ }
Dans Visual Studio il m'indique que dans map.cpp je définis un méthode hasFreePlace déjà définie sous une autre signature.
Code : Sélectionner tout - Visualiser dans une fenêtre à part map.cpp(12): error C2440: 'initialisation'*: impossible de convertir de 'Caisse *' en 'osg::ref_ptr<T>'
lorsque je change mon type de retour dans map.cpp par Caisse* (juste pour lui faire plaisir) :
Il me semble d'ailleurs qu'il n'est pas interdit de renvoyer un ref_ptr comme on peut le constater dans le lien que j'ai citer plus haut :
Code : Sélectionner tout - Visualiser dans une fenêtre à part map.cpp(10): error C2556: 'Caisse *Map::hasFreePlace(int,int)'*: la fonction surchargée ne diffère que par le type de retour de 'osg::ref_ptr<T> Map::hasFreePlace(int,int)'
The right answer here is to actually return a ref_ptr<> as the value of the function:
Voici les codes des classes caisse et block :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 osg::ref_ptr<osg::Node> SomeClass::createANode() { osg::ref_ptr<osg::Node> nRefPtr = new osg::Node; return nRefPtr; // OK! }
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 //Block.h #include "Map.h" #include <osg/Array> using namespace osg; class Block : Referenced{ protected: ref_ptr<Map> map; int x, y; public: Block(osg::ref_ptr<Map> map, int x, int y){ this->map = map; this->x=x; this->y=y; } virtual bool moveLeft() = 0; /*virtual bool moveRight() = 0; virtual bool moveUp() = 0; virtual bool moveDown() = 0;*/ };Je suis donc un peu perdu vu le manque de documentation, j'aimerais vous demander votre avis.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 //Caisse.h #pragma once #include "Block.h" #include "Map.h" #include <osg/Array> class Caisse : public Block{ public: Caisse(osg::ref_ptr<Map> map, int x, int y):Block(map,x,y){} bool moveLeft(); };
Partager