2010-08-26 19 views
6

Yığın ayrılan nesneler için shared_from_this çağrısı nedir? Temel sınıflar listesindeki enable_shared_from_this, yalnızca yığın üzerinde oluşturma için türetilmiş sınıfın kullanıcısıdır (ve doğru sınıf kullanımı için umuyoruz) veya bu tür hatalara karşı daha güçlü bir koruma sağlayabilir miyiz? Ya da bazı anları anlamıyorum?

örnek kod: Eğer gizli contstructors yapabilir ve yalnızca Shared_ptr dönmek oluşturma işlevlerini sağlayabilir bu soruna karşı korumak için Yani enable_shared_from_this ve yığıntaki nesneler

 
class C : public enable_shared_from_this<C> 
{ 
public: 
    shared_ptr<C> method() { shared_from_this(); } 
};

void func() { C c; shared_ptr<C> ptr = c.method(); // exception comming from shared_from_this() }

+1

Tam olarak ne soruyorsunuz? Yığın-ayrılmış nesneler üzerinde 'shared_from_this()' işlevini engellemenin bir yolu olup olmadığını bilmek ister misiniz? –

cevap

10

- nesne yığın tahsis edilemez bu şekilde, örneğin: Eğer anoperator için isteyen bulursanız

class C : public enable_shared_from_this<C> 
{ 
public: 
    static shared_ptr<C> create() { return shared_ptr<C>(new C()); } 
    shared_ptr<C> method() { shared_from_this(); } 

private: 
    C() {...} 

    // Make operator= and C(const C&) private unimplemented 
    // so the used cant do bad things like C c(* c_ptr); 
    C& operator=(const C &); 
    C(const C &); 
}; 


void func() 
{ 
    C c; // This doesnt compile 
    shared_ptr<C> ptr = c.method(); // So you can never get this 
} 

void altfunc() 
{ 
    shared_ptr<C> c_ptr = C::create(); 
    C & c_ref = *c; 
    shared_ptr<C> ptr = c_ref.method(); // OK 
} 

= Eğer bu

// This goes in class C 
shared_ptr<C> C::clone() const 
{ 
    return shared_ptr<C>(new C(*this)); 
} 

// This is how you can use it 
shared_ptr<C> c2 = c1->clone(); 
gibi bir şey özel hayata kopya kurucu kullanarak bir klon işlevi sağlayabilir
+0

Kasıtlı olarak kötülük yapmak için bazı çemberler üzerinden atlamaya istekli iseniz bunları hala yığında ayırabileceğinizi biliyorum .. ama IMHO bu en masum hatalardan korur. –

+0

Yani başlangıçta sadece yığın sınıfları tasarlayacağız ... Bu yaklaşım yaygın olarak kullanılıyor mu? – cybevnm

+0

Atama operatörünü neden devre dışı bırakmanız gerekiyor? Shared_ptr'de tutulan nesnelerden/atamalarından normal olarak iyidir. İki * mevcut * nesne arasındaki herhangi bir diğer görevle aynı şekilde ele alınacaktır - referans sayımları bundan etkilenmeyecektir. İki * farklı * nesne, ödevden sonra aynı içeriğe sahip olacaktır. – nobar