boost::shared_ptr und this



  • Hi,

    ich möchte an eine Methode einen this-Zeiger in einem boost-container übergeben. Dafür mache ich derzeit das:

    class klasse;
    void methode (boost::shared_ptr<klasse>& reference);
    
    class klasse
    {
    public:
        klasse () {};
        ~klasse () {};
    
        void foobar ()
        {
            methode (boost::shared_ptr<klasse>(this));
        }
    
        void machwas ()
        {
            std::cout << "asdf" << std::endl;
        }
    };
    
    void methode (boost::shared_ptr<klasse>& reference)
    {
        reference->machwas ();
    }
    
    int main ()
    {
        klasse instanz;
        instanz.foobar ();
    }
    

    Doch shared_ptr führt am ende ein delete aus, was es natürlich "knallen" lässt.

    Jemand eine idee den this-zeiger zu kapseln?



  • Für was kapseln?! 🙄

    EDIT:
    Du kannst ansonsten ja auch einen normalen container, wie std::list nehmen.



  • drakon schrieb:

    Für was kapseln?! 🙄

    möchte pointer so weit wie möglich vermeiden. natürlich sieht es auch knuffiger aus 😉



  • Geht es dir darum, Zeiger auf die Klasse ( this ) in einem Container zu speichern?

    Falls ja, ist hier ein roher Zeiger besser, da ja kein Besitz verwaltet werden muss. shared_ptr ist nicht die Universallösung. 😉
    Also wie drakon gesagt hat, z.B. mit std::vector :

    std::vector<klasse*> vec;
    


  • Übergibt halt ne referenze auf deien klasse.



  • Einmal "ohne Zeiger":

    class klasse;
    void methode (boost::shared_ptr<klasse>& reference);
    
    class klasse
    {
    public:
        klasse () {};
        ~klasse () {};
    
        void foobar ()
        {
            methode (boost::shared_ptr<klasse>(*this));
        }
    
        void machwas ()
        {
            std::cout << "asdf" << std::endl;
        }
    };
    
    void methode (klasse& reference)
    {
        reference.machwas ();
    }
    
    int main ()
    {
        klasse instanz;
        instanz.foobar ();
    }
    

  • Administrator

    Und ich bin der Meinung, es würde auch mit einem shared_ptr gehen, aber dies hier nur als Zusatz. Es scheint mir, du würdest es wirklich besser auf einen anderen Weg lösen. shared_ptr ist keine universelle Lösung!

    struct EmptyDeleter
    {
      template<typename T>
      void operator ()(T) { };
    };
    
    class Test
    {
    public:
      void test()
      {
        boost::shared_ptr<Test> ptr(this, EmptyDeleter());
        foo(ptr);
      }
    };
    
    void foo(boost::shared_ptr<Test> ptr)
    {
    }
    
    // ...
    

    Grüssli


Anmelden zum Antworten