Tôi gặp khó khăn trong việc hiểu cách sử dụng con trỏ thông minh như các thành viên lớp trong C ++ 11. Tôi đã đọc rất nhiều về con trỏ thông minh và tôi nghĩ rằng tôi hiểu cách thức unique_ptr
và shared_ptr
/ weak_ptr
công việc nói chung. Những gì tôi không hiểu là sử dụng thực sự. Có vẻ như tất cả mọi người khuyên bạn nên sử dụng unique_ptr
như là cách để đi gần như mọi lúc. Nhưng làm thế nào tôi có thể thực hiện một cái gì đó như thế này:
class Device {
};
class Settings {
Device *device;
public:
Settings(Device *device) {
this->device = device;
}
Device *getDevice() {
return device;
}
};
int main() {
Device *device = new Device();
Settings settings(device);
// ...
Device *myDevice = settings.getDevice();
// do something with myDevice...
}
Hãy nói rằng tôi muốn thay thế con trỏ bằng con trỏ thông minh. A unique_ptr
sẽ không hoạt động vì getDevice()
, phải không? Vì vậy, đó là thời gian khi tôi sử dụng shared_ptr
và weak_ptr
? Không có cách sử dụng unique_ptr
? Có vẻ như đối với tôi, hầu hết các trường hợp shared_ptr
có ý nghĩa hơn trừ khi tôi sử dụng một con trỏ trong phạm vi thực sự nhỏ?
class Device {
};
class Settings {
std::shared_ptr<Device> device;
public:
Settings(std::shared_ptr<Device> device) {
this->device = device;
}
std::weak_ptr<Device> getDevice() {
return device;
}
};
int main() {
std::shared_ptr<Device> device(new Device());
Settings settings(device);
// ...
std::weak_ptr<Device> myDevice = settings.getDevice();
// do something with myDevice...
}
đó là phải đường để đi không? Cảm ơn rất nhiều!
shared_ptr
là chính xác trong 8/10 trường hợp. 2/10 khác được phân chia giữa unique_ptr
và weak_ptr
. Ngoài ra, weak_ptr
thường được sử dụng để phá vỡ các tham chiếu tròn; Tôi không chắc chắn rằng việc sử dụng của bạn sẽ được coi là chính xác.
device
thành viên dữ liệu? Trước tiên bạn phải quyết định điều đó.
unique_ptr
thay thế và từ bỏ quyền sở hữu khi gọi nhà xây dựng, nếu tôi biết tôi sẽ không cần nó nữa. Nhưng là người thiết kế của Settings
lớp, tôi không biết liệu người gọi có muốn giữ một tài liệu tham khảo không. Có thể thiết bị sẽ được sử dụng ở nhiều nơi. Ok, có lẽ đó chính xác là quan điểm của bạn. Trong trường hợp đó, tôi sẽ không phải là chủ sở hữu duy nhất và đó là khi tôi sẽ sử dụng shared_ptr, tôi đoán vậy. Và: vì vậy điểm thông minh làm thay thế con trỏ, nhưng không tham chiếu, phải không?
device
đến hàm tạo củasettings
, bạn có muốn vẫn có thể tham chiếu đến nó trong phạm vi gọi điện thoại hay chỉ thông quasettings
? Nếu sau này,unique_ptr
là hữu ích. Ngoài ra, bạn có một kịch bản trong đó giá trị trả vềgetDevice()
lànull
. Nếu không, chỉ cần trả lại một tài liệu tham khảo.