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 & Héritage


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 & Héritage
    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);
    };
    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){
     
    }
    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
    map.cpp(12): error C2440: 'initialisation'*: impossible de convertir de 'Caisse *' en 'osg::ref_ptr<T>'
    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.

    lorsque je change mon type de retour dans map.cpp par Caisse* (juste pour lui faire plaisir) :

    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)'
    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 :

    The right answer here is to actually return a ref_ptr<> as the value of the function:

    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! 
       }
    Voici les codes des classes caisse et block :

    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;*/
    };
    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();
    };
    Je suis donc un peu perdu vu le manque de documentation, j'aimerais vous demander votre avis.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Il semble qu'il y a un code que vous ne montrez pas. Le code d'une fonction qui retourne un Caisse* et qui s’appelle hasFreePlace. Et comme la fonction est déjà définie, le compilateur trouve un conflit (deux signatures identiques qui ne diffèrent que par le type de retour).
    Aussi, ce n'est pas une problème de pointeur intelligent.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    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
    Non la seul déclaration de cette fonction se trouve ci dessus et il n'y en a qu'une. Le problème est résolu et provenait du fait que deux classes se référençaient et qu'il manquait un ; à la fin de la déclaration d'une des deux. Ces deux petits problèmes pour générer un tel quantité étranges d'erreur. J'ai finis par chipoté correctement les includes et j'ai enfin réussis à compiler.

    Le passage java -> c++ est assez rude ...

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. osg::Smart pointer & inclusion cyclique
    Par zorglue dans le forum OpenSceneGraph
    Réponses: 1
    Dernier message: 21/10/2012, 02h05
  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