Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tentative de référencement d'une fonction supprimé

    18 juillet 2019 à 19:02:42

    Bonjour à tous,

    Je suis assez nouveau dans la POO /c++ je rencontre un problème de compilation sur une tentadive de reférencement de fonction suppimée:

    voilà la définition de la fonction :

    const ElementBillboard& castBillboard() const {
    				MLIB_ASSERT(m_elementType == ELEMENT_TYPE_BILLBOARD);
    				return *((ElementBillboard*)this);

    et la fonction est invoquée ici par exemple :

    void addElement(const std::string& elementId, const Element& e) {
    			auto type = e.getType();
    			if (type == ELEMENT_TYPE_BILLBOARD) {
    				auto _e = e.castBillboard();
    				addBillboard(elementId, _e.m_box, ColorImageR8G8B8A8(_e.m_tex.getImage()), _e.m_depth);

    Merci d'avance :)


    • Partager sur Facebook
    • Partager sur Twitter
      18 juillet 2019 à 19:14:52

      Ta fontion retourne une reference ..

      auto _e = e.castBillBoard() fait appel a l'operateur d'assigment par copie
      operator=(const & other) doit etre non défini.

      Défini un constructeur / operateur d'assigment par copie.
      • Partager sur Facebook
      • Partager sur Twitter
        18 juillet 2019 à 19:17:58

        Lu',

        ta classe ElementBillbord est surement non-copiable et pourtant tu essaies d'effectuer une copie à la ligne 4.

        Sinon le RTTI n'est pas ouf. Ta classe Element n'est pas assez generique.

        • Partager sur Facebook
        • Partager sur Twitter

        Eug

          19 juillet 2019 à 14:33:26

          Salut,

          Déjà, tu risque d'avoir un gros problème, vu que ta fonction castillBoard() est déclarée constante, et qu'elle renvoie un ElementBilboard sous forme d'une référence constante.

          Or, ElementBillboard est une classe ayant, de toutes évidence (et à juste titre) sémantique d'entité, vu qu'elle est non copiable et non assignable (le constructeur de copie (ElementBillboard(ElmentBillboard const &) et l'opérateur d'affectation ElementBillboard & operator = (ElementBillboard const &) ont été définis comme "delete").

          Tu ne peux donc pas créer de copie de cet élément, et la constance induite par l'appel à  castillBoard t'empêchera de le modifier.  Ce n'est pas une mauvaise chose, loin de là, mais... ce n'est peut-être pas ce que tu veux ;)

          Pour résoudre ton problème, tu dois simplement récupérer l'élément renvoyé par la fonction castillBoard sous la forme d'une référence (pour éviter la copie) constante (pour respecter les restrictions imposées par la fonction), c'est à  dire, sous une forme proche de

          auto const & _e = e.castBillboard();


          Ensuite, je ne peux qu'être d'accord avec eugchriss : tu devrais avoir recours au double dispatch (éventuellement au patron de conception visiteur), si tu as des éléments qui ne sont pas tous de type élément billboard, par exemple, sous une forme qui pourrait être proche de

          class Element{
          public:
              /* pour assurer la sémantique d'entité */
              Element(Element const &) = delete;
              Element & operator=(Element const &) = delete;
              virtual ~Element() = default;
              virtual void add(std::string const & id) = 0;
          };
          
          /* la fonction spécifique à l'ajout d'un casillboard */
          void addCastillboard(std::string const & id, Box const & box, Color const &){
              /*... */
          }
          /* l'élément qui convient :
          class BillBoard : public Element{
          public:
              void add(std::string const & id) override{
                  addCastillboard(id, *this, text_.getImage());
              }
          private:
            Text text_; 
          };

          Cela t'évitera bien des soucis par la suite, je peux te l'assurer ;)

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait

          Tentative de référencement d'une fonction supprimé

          × 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