Partage
  • Partager sur Facebook
  • Partager sur Twitter

un detail sur le const

    31 août 2023 à 1:22:13

    Bonjour , 

    suite a quelques experimentations je me suis confronter a un probleme dans lequel je devais faire un choix voici la situation

    ShapeButton::ShapeButton(const sf::Vector2f& position,const sf::Shape& shape)

    une class "ShapeButton" prend dans son constructeur un const sf::Shape& cela a pour but de faire 

    ShapeButton(position, sf::RectangleShape(...));
    ShapeButton(position, sf::CircleShape(...));
    

    il y a 2 choses a voir ici deja je peut cree plusieurs "shapes"(RectangleShape , CircleShape, ...) , car sf::Shape est abstrait et je peux cree le sous_sf::Shape dans l'appel du constructeur pour plus de context voici ma class entiere

    class ShapeButton : virtual public Button
    {
    public : 
    	ShapeButton(const sf::Vector2f& position, const sf::Shape& shape);
    	ShapeButton(const sf::Color& color, const sf::Shape& shape);
    	ShapeButton(const sf::Vector2f& position, const sf::Color& color, const sf::Shape& shape);
    
    	virtual sf::FloatRect getGlobalBounds() { return m_shape.getLocalBounds(); };
    
    	virtual void update();
    	virtual ~ShapeButton() {};
    protected :
    
    	virtual void setColor(const sf::Color& color);
    	virtual void setPosition(const sf::Vector2f& position);
    
    	virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const { target.draw(m_shape); }
    
    private : 
    	sf::Shape& m_shape;
    };

    on peut vite remarquer que m_shape est une reference je ne peut pas faire 

    sf::Shape m_shape

    car sf::Shape est abstrait , jusqu'ici il n'y a pas beaucoup de lien avec le const , il arrive maintenant 

    dans le .cpp voicie un des constructeur de ShapeButton

    ShapeButton::ShapeButton(const sf::Vector2f& position,const sf::Shape& shape) : Button(position), m_shape(const_cast<sf::Shape&>(shape))
    {
    	m_shape.setPosition(position);
    }
    

    dans une sous class de ShapeButton j'appel ainsie le constructeur 

    ShapeButton(position, sf::RectangleShape(sf::Vector2f(text.getGlobalBounds().width, text.getGlobalBounds().height)))

    or par le fait que m_shape est une reference il ne peut pas prendre un element constant c'est pourquois je fais 

    m_shape(const_cast<sf::Shape&>(shape))

    mais cela a t'il un sens on voit bien que le mot clef const m'est tres utile dans cette situation cependant je trouve sa tres etrange de le rendre const puis de l'enlever esque cela pose un probleme, faut il eviter cette pratique et pourquoi si vous pouviez m'eclairer car j'ai envie d'en abuser :)








    • Partager sur Facebook
    • Partager sur Twitter
      31 août 2023 à 1:33:24

      Globalement, si tu utilises const_cast, c'est qu'il y a une merde dans ton code. const_cast est très piégeur et utilisable que dans des cas très spécifiques.

      Ton shape n'est pas constant puisque tu le modifie via un setter. Donc supprime juste les const.

      ShapeButton::ShapeButton(const sf::Vector2f& position, sf::Shape& shape)



      • Partager sur Facebook
      • Partager sur Twitter
        31 août 2023 à 1:49:53

        gbdivers a écrit:

        Globalement, si tu utilises const_cast, c'est qu'il y a une merde dans ton code. const_cast est très piégeur et utilisable que dans des cas très spécifiques.

        Ton shape n'est pas constant puisque tu le modifie via un setter. Donc supprime juste les const.

        ShapeButton::ShapeButton(const sf::Vector2f& position, sf::Shape& shape)

        en temp normal c'ets ce que je ferais de retirer le const sauf qu'ici il me permet de cree le sf::shape en question dans le constructeur et je souhaite garder cette possibilité , je pourrais juste retirer le setteur (dasn mon cas il n'est pas utile )et donc ne pas utiliser const_cast cependant imagineons que mon setteur soit utile et que je souhaite garder la fonctionnalité d'innitialiser le sf::Shape& dans le constructeur estce que faire ca c'est mauvais ,je supose que dans mon cas il doit y avoir une solution avec les smart pointeur mais c'est toujours bien de connaitre cette facon de faire (si elle est fiable) 

        de plus peut tu s'il te plait m'expliquer dans quel cas tres specifique tu considere le const_cast comme utilisable merci :) .

        -
        Edité par MathéoBrument 31 août 2023 à 1:50:18

        • Partager sur Facebook
        • Partager sur Twitter
          31 août 2023 à 2:09:24

          MathéoBrument a écrit:

          ici il me permet de cree le sf::shape en question dans le constructeur et je souhaite garder cette possibilité

          Pas sur de comprendre ce que tu veux dire par là, mais ça me semble encore plus louche. Et pas possible, a priori.

          MathéoBrument a écrit:

          de plus peut tu s'il te plait m'expliquer dans quel cas tres specifique tu considere le const_cast comme utilisable 

          Quand celui qui veut faire ça m'apporte des arguments assez fort pour le justifier. Ce que je n'ai jamais encore rencontré, en dehors d'un problème de design (en général, faire de la glue avec une API existante, qui impose de faire ce type de cast)

          • Partager sur Facebook
          • Partager sur Twitter

          un detail sur le const

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown