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

SFML Discussion :

Polymorphisme problème d'accès aux fonctions membres


Sujet :

SFML

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut Polymorphisme problème d'accès aux fonctions membres
    Bonjour, il y a peux j'ai demander comment faire en sorte que les fonction membre de la classe B si-dessous soit accessible depuis mon vector A. On m'avait dit que c'était possible grâce au polymorphisme mais en réalité ça ne fonctionne pas du tout.
    Dans le rôle de la class A, j'ai :
    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
    31
    32
    33
    34
    35
    36
     
    class Entity : public sf::Drawable, public sf::Transformable
    {
    public:
     
        Entity( sf::Vector2f const &size, sf::Vector2f const &position )
        {
            _shape.setFillColor(sf::Color::Red);
            _shape.setPosition(position);
            _shape.setSize(size);
        }
     
        void setPosition( sf::Vector2f const &position )
        {
            _shape.setPosition( position );
        }
     
        sf::Vector2f getPosition() const
        {
            return _shape.getPosition();
        }
     
    protected:
     
        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
        {
            states.transform *= getTransform();
     
            states.texture = NULL;
     
            target.draw(_shape);
        }
     
        sf::RectangleShape _shape;
     
    };
    Et dans le rôle de la class B j'ai ceci :

    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
     
    class Bullet : public Entity
    {
    public:
     
        Bullet( sf::Vector2f size, sf::Vector2f position ) : Entity( size, position )
        {
     
        }
     
        void create( float velocity, unsigned int direction )
        {
            std::cout << "created";
            _velocity = velocity;
            _direction = direction > 360 ? 360 : direction;
        }
     
        void update()
        {
            std::cout << "updated" << std::endl;
            _shape.move( sf::Vector2f( std::cos( _direction ) * _velocity, std::sin( _direction ) * _velocity ) );
        }
     
    private:
     
        float _velocity;
        unsigned int _direction;
    };
    Donc dans mon main j'ai fait comme on me l'avait dit en faisant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    std::vector<std::unique_ptr<Entity>> v_e;
     
    auto b = std::make_unique<Bullet>( sf::Vector2f(10,10), sf::Vector2f(75,75) ) ;
    b->create( 1000, 75 );
     
    v_e.push_back( std::move(b) );
    Mais maintenant si je veux accéder à la fonction membre update() de ma classe B et bien cela n'utilise pas ma fonction.

    Pour y accéder je fait comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for( size_t i{0}; i < v_e.size(); ++i )
       v_e[i]->update();
    Donc certes je n'ai aucune erreurs mais ça n'a pas du tout résolue mon problème
    Que doit-je faire d'autre pour que cela fonctionne ?

  2. #2
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    mars 2014
    Messages
    946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : mars 2014
    Messages : 946
    Points : 2 495
    Points
    2 495
    Par défaut
    Pour faire ce que tu veux faire, tu as besoin d'une fonction virtuelle update(...) dans ta classe de base Entity (à moins qu'elle soit héritée par Drawable ou Transformable, mais je ne le crois pas), que tu réécris dans ta classe fille B.

    Pourrais-tu nous montrer la définition de cette méthode pour les 2 classes ?

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut
    C'est bon ça marche parfaitement !
    donc pour ma class entity j'ai :
    et pour ma class bullet j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void update()
    {
        std::cout << "updated" << std::endl;
        _shape.move( sf::Vector2f( std::cos( _direction ) * _velocity, std::sin( _direction ) * _velocity ) );
    }
    Merci beaucoup

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 17/03/2007, 18h31
  2. Réponses: 2
    Dernier message: 30/01/2006, 13h30
  3. [Applet] problèmes d'accès aux images
    Par wwave dans le forum Interfaces Graphiques en Java
    Réponses: 18
    Dernier message: 16/09/2005, 15h42
  4. [TOMCAT] JSP problème d'accès aux méthodes d'une classes
    Par gunnm dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 22/05/2004, 15h02

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