2012-05-10 33 views
7

Tôi đang cố gắng để vượt qua 'này' để các nhà xây dựng sử dụng std :: make_sharedC++ 11 Passing 'này' như paramenter cho std :: make_shared

Ví dụ:

// headers 
class A 
{ 
public: 
    std::shared_ptr<B> createB(); 
} 


class B 
{ 
private: 
    std::shared_ptr<A> a; 

public: 
    B(std::shared_ptr<A>); 
} 


// source 
std::shared_ptr<B> A::createB() 
{ 
    auto b = std::make_shared<B>(this); // Compiler error (VS11 Beta) 
    auto b = std::make_shared<B>(std::shared_ptr<A>(this)); // No compiler error, but doenst work 
    return b; 
} 

Tuy nhiên điều này không hoạt động đúng, bất kỳ đề xuất làm thế nào tôi có thể vượt qua chính xác điều này như một đối số?

Trả lời

13

Tôi nghĩ những gì bạn có thể muốn ở đây là shared_from_this.

// headers 
class A : std::enable_shared_from_this<A> 
{ 
public: 
    std::shared_ptr<B> createB(); 
} 


class B 
{ 
private: 
    std::shared_ptr<A> a; 

public: 
    B(std::shared_ptr<A>); 
} 


// source 
std::shared_ptr<B> A::createB() 
{ 
    return std::make_shared<B>(shared_from_this()); 
} 

Update để bao gồm comments from David Rodriguez:

Lưu ý rằng shared_from_this() nên bao giờ được gọi trên một đối tượng mà chưa được quản lý bởi một shared_ptr. Đây là hợp lệ:

shared_ptr<A> a(new A); 
a->createB(); 

Trong khi dẫn sau đây để xác định hành vi (cố gắng gọi delete trên a):

A a; 
a.createB(); 
+0

Thanks a lot Andrew! – RdR

+7

Điều quan trọng cần lưu ý là 'shared_from_this()' yêu cầu đối tượng hiện tại đã được quản lý trong một 'shared_ptr'. I E. 'int main() {A a; a.createB(); } 'là hành vi không xác định, trong khi' int main() {shared_ptr a (new A); a-> createB(); } 'là chính xác. –

+0

@ DavidRodríguez-dribeas Tuyệt đối. Tôi đã cập nhật câu trả lời cho phù hợp. Cảm ơn. –

Các vấn đề liên quan