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_ptrist nicht die Universallösung.
Also wie drakon gesagt hat, z.B. mitstd::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 (); }
-
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