[ glorius @ 02.01.2012. 14:31 ] @
Koristim boost::shared_ptr za memory management klasa u aplikaciji. Imam klasu Object koja je bazna klasa i koja je nasledjena is boost::enable_shared_from_this da bih mogao da koristim shared_from_this() feature.

Code:


class Object : public boost::enable_shared_from_this<Object>
{
      .....
}

class Application : public Object
{
    .....
}

class GraphicsApplication : public Application
{
    .....
}



Problem nastaje kada iz izvedene klase GraphicsApplication pokusam da pozovem shared_from_this() ( verovatno je isti problem i sa Application klasom ali nisam probao ).
Pokusao sam na razne nacine da castujem shared_from_this() poziv u GraphicsApplication klasi, isprobao nekoliko saveta koje sam nasao na netu ali nista od toga ne radi.

Tako da je pitanje, kako pravilno dizajnirati ovaj kod da shared_from_this() radi u izvedenim klasama?
[ Nedeljko @ 03.01.2012. 11:25 ] @
Ako je klasa Derived izvedena iz Base, to ne povlači nasleđivanje između klasa boost::shared_ptr<Base> i boost::shared_ptr<Derived>. Klasa Base ako je izvedena iz klase boost::enable_from_this ima metodu shared_from_this() koja vraća boost::shared_ptr<Base> i klasa Derived nasleđuje tu metodu sa istim potpisom. Ako klasu Derived izvedeš iz klasa Base i boost::enable_from_this<Derived>, ona će imati metodu shared_from_this, koja vraća boost::shared_ptr<Derived>. Međutim, pitanje je da li je to potrebno, jer sirovi pokazivač iz boost::shared_ptr<Base> možeš da pretvoriš u sirovi pokazivač na Derived, kao i upućivanje (reference) na pokazivani objekat u upućivanje na Derived.
[ glorius @ 03.01.2012. 15:11 ] @
Hvala na odgovoru. Nasao sam gde je greska.

Ja sam GraphicsApplication inicijalizovao kao raw pointer i mislim da zato mehanizam za shared_from_this() nije radio i kada sam promenio da se GraphicsApplication inicijalizuje kao shared_ptr program je proradio.

Code:


boost::shared_ptr<Application> app(new GraphicsApplication);

if(app->initInstance())
{
    app->run();
}



shared_from_this() za klasu GraphicsApplication dobijam sada na sledeci nacin ( npr, u metodi initInstance() ):

Code:


bool GraphicsApplication::initInstance()
{
      boost::shared_ptr<Object> obj = shared_from_this();
      boost::shared_ptr<GraphicsApplication> me = boost::static_pointer_cast<GraphicsApplication>(obj);
}