2012-09-23 28 views
7

Tôi là C++ 11-ing một số mã. Tôi cóSử dụng unique_ptr cho quyền sở hữu và con trỏ thô nếu không?

class X { /* */ }; 

class A { 
    std::vector<X*> va_x; 
}; 

class B { 
    std::vector<X*> vb_x; 
    std::vector<A> vb_a; 
}; 

X * s của "va_x" bên trong lớp học của tôi Một điểm để các đối tượng cũng được trỏ đến bởi X * s của "vb_x" bên trong lớp B. tôi

Bây giờ tôi sẽ thích sử dụng con trỏ thông minh. Đối với tôi, có vẻ như rõ ràng rằng lớp B có quyền sở hữu của các đối tượng được trỏ bởi X * (đặc biệt là vì A trường hợp của tôi thuộc về B)

Vì vậy, tôi nên sử dụng một unique_ptr cho X bên B:

class B { 
    std::vector<unique_ptr<X>> vb_x; 
    std::vector<A> vb_a; 
}; 

Câu hỏi của tôi là, tôi nên làm gì cho lớp A? Tôi có nên giữ nguyên con trỏ không? Bằng cách làm như vậy, trong các thử nghiệm đơn vị của tôi, tôi phải thừa nhận rằng nó dẫn đến mọi việc tồi tệ (IMO), ví dụ (đừng lo lắng về đóng gói, đó không phải là điểm):

unique_ptr<X> x(new X()); 
A a; 
a.va_x.push_back(&(*x)); //awkward, but what else can I do? 

A.vb_a.push_back(a); //ok 
B.vb_x.push_back(move(x)); //ok 
+0

Đối với các câu hỏi trong tương lai về C++ 11, vui lòng gắn thẻ chúng với C++. :) – Xeo

+1

Bạn đã không hỏi một câu hỏi gần như giống hệt nhau chưa? – Puppy

+0

@DeadMG Vâng trước đó cũng là về unique_ptr nhưng điều này không phải là cùng một điều tôi nghĩ rằng –

Trả lời

9

Bạn có thể sử dụng x.get(), sẽ trả về con trỏ bên trong.

Ngoài ra, có, sử dụng các con trỏ thô để xử lý các tham chiếu không sở hữu là cách để đi, xem thêm this question.

+0

Ok cảm ơn. Nhưng điều này không tốt hơn nhiều? Vì vậy, tôi nên sử dụng con trỏ thô anyway? –

+0

@ BérengerBerthoul: Không có gì * sai với việc sử dụng các con trỏ thô miễn là chúng không sở hữu bất kỳ thứ gì. Như tên nói, họ chỉ nên trỏ đến mọi thứ và mọi thứ đều ổn. – Xeo

+0

Đoán nó đã giải quyết nó sau đó. Tôi rất thận trọng về những tính năng mới này bởi vì tôi không thấy bất kỳ mã thực sự nào với chúng. Và khi tôi nghe "thay thế con trỏ thô của bạn bằng con trỏ thông minh" ở khắp mọi nơi, tôi bắt đầu nghĩ con trỏ thô không cần nữa (không phải là rất thông minh mà tôi thừa nhận ...) Cảm ơn –

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