Tôi chưa bao giờ sử dụng bất kỳ loại con trỏ thông minh nào, nhưng tôi tiếp tục đọc về chúng hầu như ở khắp mọi nơi khi chủ đề là con trỏ. Tôi hiểu rằng có những tình huống mà con trỏ thông minh đẹp hơn nhiều so với con trỏ thô, vì một số mở rộng chúng quản lý quyền sở hữu con trỏ. Tuy nhiên, tôi vẫn không biết, đó là dòng giữa "Tôi không cần con trỏ thông minh cho rằng" và "đây là một trường hợp cho con trỏ thông minh".Tại sao tôi muốn sử dụng một con trỏ thông minh trong tình huống này?
phép nói rằng, tôi có tình hình sau:
class A {
public:
double get1(){return 1;}
double get2(){return 2;}
};
class SomeUtilityClass {
public:
SomeUtilityClass(A* a) : a(a) {}
double getResult(){return a->get1() + a->get2();}
void setA(A* a){a = a;}
private:
A* a;
};
int main(int argc, char** argv) {
A a;
SomeUtilityClass u(&a);
std::cout << u.getResult() << std::endl;
A a2;
u.setA(&a2);
std::cout << u.getResult() << std::endl;
return 0;
}
Đây là khóa học một ví dụ đơn giản đi. Ý tôi là, SomeUtilityClass
không phải là "sở hữu" một thể hiện của A
(vì nó chỉ là một lớp tiện ích), do đó nó chỉ giữ một con trỏ.
Liên quan đến con trỏ, điều duy nhất mà tôi nhận thức được rằng có thể đi sai là:
SomeUtilityClass
có thể được khởi tạo với một con trỏ null- Các đối tượng được trỏ tới có thể bị xóa/đi ra khỏi phạm vi, mà không cần
SomeUtilityClass
để ý thấy nó
Làm thế nào một con trỏ thông minh có thể giúp tránh vấn đề này? Những lợi ích khác tôi sẽ nhận được bằng cách sử dụng một con trỏ thông minh trong trường hợp này?
PS: Tôi biết rằng có một số câu hỏi về con trỏ thông minh (ví dụ: this one). Tuy nhiên, tôi sẽ đánh giá cao, nếu bạn có thể cho tôi biết về tác động của ví dụ cụ thể này.
Con trỏ thô hoàn toàn nắm bắt được khái niệm về tham chiếu không sở hữu đối với dữ liệu với thời gian tồn tại phạm vi. Bạn không nên sử dụng con trỏ thông minh ở đây. – Mankarse
Nếu bạn đang sử dụng 'mới' trong tự nhiên, đó là một gợi ý khá mạnh, bạn có thể cần một con trỏ thông minh. Nếu bạn đang sử dụng 'new []', đó là một gợi ý khá mạnh, bạn có thể cần một 'std :: vector' hoặc một container khác. – JBL
Nếu 'nullptr' không có ý nghĩa, bạn có thể xem xét tham chiếu hoặc' std :: reference_wrapper' thay thế. –