因此,爲了防止這個問題,你可以讓你的contstructors私有的,只能提供創建函數返回shared_ptr的 - 這樣的對象不能在棧上分配,就像這樣:
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
}
如果你發現自己希望爲anoperator =您可以提供使用私有實現的拷貝構造一個克隆功能,像這樣
// 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();
你到底在問什麼?你想知道是否有辦法防止在堆棧分配的對象上調用'shared_from_this()'? – 2010-08-26 10:08:53