2010-07-12 31 views
5

Tôi có hai lớp với một mối quan hệ cha-con (khách hàng & nhằm mục & tập tin vv)tăng shared_ptr và 'này'

Tôi có

typedef boost::shared_ptr<Parent> ParentPtr 

và trong lớp cha mẹ một phương pháp để thực hiện một con

Tôi cần các phiên bản con để có con trỏ đến cha mẹ của chúng.

class Child 
{ 
.... 
    ParentPtr m_parent; 
.... 
} 

Tôi muốn nó là shared_ptr để cha mẹ không biến mất khi có con. Tôi cũng có những người khác giữ ParentPtrs cho phụ huynh (phương pháp nhà máy cho phụ huynh trả về một ParentPtr)

Câu hỏi: làm thế nào có thể cung cấp cho các con một nỗ lực ParentPtr

(1). Trong Parent :: ChildFactory

child->m_parent.reset(this); 

kết quả này là những điều rất xấu. Hiện tại có 2 chuỗi 'ParentPtr' trỏ vào phụ huynh; kết quả là cái chết sớm của Parent

cố gắng (2). Cha mẹ có

ParentPtr m_me; 

được sao chép từ giá trị trả lại của nhà máy chính. Vì vậy, tôi có thể làm

child->m_parent = m_me; 

Nhưng bây giờ Chánh không bao giờ chết vì nó giữ một tham chiếu đến bản thân

Trả lời

8

Tôi khá chắc chắn rằng enable_shared_from_this giải quyết vấn đề của bạn: http://live.boost.org/doc/libs/1_43_0/libs/smart_ptr/enable_shared_from_this.html

Nếu bạn có nguồn gốc lớp học của bạn từ một chuyên môn của boost::enable_shared_from_this sau đó bạn có thể sử dụng shared_from_this() trong một hàm thành viên để có được con trỏ chia sẻ sở hữu this (giả sử rằng có một).

Ví dụ:

class Parent : public boost::enable_shared_from_this<Parent> 
{ 
    void MakeParentOf(Child& c) 
    { 
     c.m_parent = shared_from_this(); 
    } 
}; 
+0

câu trả lời hay - cảm ơn – pm100

+0

@ pm100: Tại sao bạn cần sử dụng 'weak_ptr'? Nếu trẻ em sở hữu bố mẹ của chúng (chia sẻ chúng) thì bạn cần sử dụng 'shared_ptr'. 'Weak_ptr' không ngụ ý quyền sở hữu. –

+0

oh vâng bạn đúng - tôi đã nghĩ đến một giải pháp khác - xóa chỉnh sửa – pm100

0

Khi phản ứng khác có con trỏ ra, trước tiên bạn sẽ phải sử dụng các enable_shared_from_this để có được những shared_ptr, nhưng sau đó con không thể giữ ref đó, nó phải sử dụng một weak_ptr. Một số weak_ptr giống như shared_ptr ngoại trừ việc nó sẽ không giữ tài liệu tham khảo cho đến khi bạn gọi phương thức get(), phương thức này sẽ trả lại cho bạn số shared_ptr bình thường mà bạn nên loại bỏ ngay khi có thể bên trong đứa trẻ.

+0

Tại sao bạn nghĩ điều này?Mô hình là trẻ em (cùng với "người khác") sở hữu bố mẹ; cha mẹ không sở hữu con cái. Nếu trẻ em sử dụng một con trỏ yếu thì nó sẽ không ngăn cản các bậc cha mẹ "biến mất" trong khi chúng vẫn có con. –

+0

@Charles Xin lỗi, tôi đã xấu. Tôi giả sử những thứ không được đề cập một cách rõ ràng: Tôi giả định rằng nếu 'shared_ptr' và' weak_ptr' được sử dụng, cha mẹ sẽ có ref cho con cái của họ. Tôi cho rằng, chỉ vì, theo mặc định, cha mẹ kiểm soát con cái của họ, cho đến khi ít nhất họ 18 tuổi và rời khỏi nhà. Nếu đó là cách khác, hãy bỏ qua mọi thứ tôi đã nói. – Gianni

+0

Vâng, tôi không biết chính xác cấu trúc mã của PM100 là gì nhưng tôi đã lý luận rằng nếu anh ta lo lắng về việc cha mẹ bị phá hủy trong khi họ vẫn có con thì lớp cha mẹ không thể sở hữu (hoặc trực tiếp bằng giá trị hoặc thông qua 'shared_ptr') các lớp con nếu không nó sẽ không được xem xét. Mối quan hệ sở hữu sẽ đảm bảo rằng một đứa trẻ không thể sống lâu hơn cha mẹ cuối cùng của nó. Vì nó là, nó là sự hiểu biết của tôi rằng quyền sở hữu yêu cầu là cách khác xung quanh: "Tôi muốn nó là một shared_ptr để cha mẹ không biến mất trong khi có con hiện có." –

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