Trong cơ sở mã của chúng tôi chúng tôi có nhiều công trình xây dựng như thế này:Safe con trỏ dereferencing trong C++
auto* pObj = getObjectThatMayVeryRarelyBeNull();
if (!pObj) throw std::runtime_error("Ooops!");
// Use pObj->(...)
Trong 99,99% các trường hợp việc kiểm tra này không được kích hoạt. Tôi đang suy nghĩ về các giải pháp sau đây:
auto& obj = deref_or_throw(getObjectThatMayVeryRarelyBeNull());
// Use obj.(...)
đâu deref_or_throw
được khai báo như sau:
template<class T> T& deref_or_throw(T* p) {
if (p == nullptr) { throw std::invalid_argument("Argument is null!"); }
return *p;
}
đang Đó là rõ ràng hơn nhiều và hoạt động như tôi cần.
Câu hỏi đặt ra là: tôi có đang phát minh lại bánh xe không? Có một số giải pháp liên quan trong tiêu chuẩn hoặc tăng cường? Hay bạn có một số ý kiến về giải pháp?
PS. Câu hỏi liên quan (không có câu trả lời thỏa mãn): Is there a C++ equivalent of a NullPointerException
Có mã nào thực sự giao dịch với trường hợp 'nullptr' không? Ví dụ. bất cứ thứ gì như 'if (! obj) {std :: cout <<" Null, nhưng vẫn ổn, hãy tiếp tục với một cái gì đó có ý nghĩa \ n "; } else {std :: cout << "Không-Null, đang làm điều gì khác \ n"; } '. Hoặc là trường hợp 'nullptr' luôn luôn là một" lối ra, bởi vì đây là sai "-path? – stefan
Mã này tồn tại, nhưng rất hiếm. Trong hầu hết các trường hợp, chúng tôi không thể tiếp tục. Không có gì chúng tôi có thể làm. Toàn bộ thói quen là vô nghĩa. Vì vậy, có thể sự tồn tại của đối tượng này là _precondition_? Và tôi cần phải kiểm tra nó và sau đó dereference bằng tay con trỏ mà không đáng lo ngại? – Mikhail
Chính xác đây là những gì bạn cần phải làm rõ cho chính mình, imho. Nếu đó là điều kiện tiên quyết, có lẽ một 'khẳng định' là phù hợp hơn. Nếu không, đây rõ ràng là một điều đặc biệt (0,01% là khá đặc biệt), do đó, một 'ngoại lệ' là thích hợp. Afaik, không có thứ gì trong thư viện. – stefan