2011-10-21 24 views
6

Tôi có một vấn đề mà khi tôi sử dụng một cái gì đó như thế này:Làm thế nào để trở về "không tìm thấy" khi giá trị trả về là const tham khảo

const MyList& my_list = getListForThisRegion(/*region ID, ...*/); 

Tôi không biết những gì sẽ trở về khi không có giá trị được tìm thấy.

Vấn đề của tôi là tôi muốn có cách để báo hiệu (khi trả lại giá trị từ getListForThisRegion) "không tìm thấy giá trị" cho người gọi. Nếu tôi trả lại một con trỏ, tôi có thể trả về nullptr, nhưng tôi không biết cách thực hiện nó với các tham chiếu. Tất cả tôi có thể nghĩ là có một số thành viên tĩnh not_found của loại MyList, và trở về một tham chiếu đến nó, nhưng nó có vẻ xấu xí.

Và có, tôi không thể trả về giá trị vì danh sách "béo" và thường được sử dụng.

EDIT: tấn câu trả lời tuyệt vời, nhưng ngoại lệ không phải là giải pháp có thể chấp nhận được vì số lần nó được nâng cao là cao (tỷ lệ phần trăm nbNotFound/nbCalls cao).
EDIT2: liên quan đến tăng :: tùy chọn - phức tạp như thế nào để làm chủ? Tôi có nghĩa là nó đòi hỏi một số kiến ​​thức không rõ ràng (không rõ ràng = cái gì đó không chỉ đơn giản là biết cú pháp)?

+3

ném ngoại lệ có thể là một lựa chọn tốt. – BigMike

+1

bạn cũng có thể muốn xem 'tăng :: tùy chọn' – Akanksh

+0

Tham chiếu phải đề cập đến một đối tượng, vì vậy bạn có thể ném ngoại lệ hoặc không sử dụng tham chiếu. 'boost :: optional' là một lựa chọn tuyệt vời, nhưng đó có thể là quá mức cần thiết; chỉ cần sử dụng một con trỏ. – GManNickG

Trả lời

7

Có hai cách để xử lý thành ngữ này:

  • Thay đổi giao diện của bạn để trở lại một kiểu có khả năng để tham khảo không có gì (ví dụ một con trỏ có thể được null, một iterator để end).

Hoặc

  • Ném một ngoại lệ nếu mặt hàng đó không được tìm thấy.

Trả về một đối tượng giả là một chút hacky, và bạn không đạt được bất cứ điều gì trên trả về một con trỏ như bạn vẫn phải kiểm tra kết quả chống lại một giá trị đặc biệt (null hoặc đối tượng dummy).

+3

'boost :: optional' là một loại tốt ở đây. –

+0

@ edA-qamort-ora-y: điều đó sẽ thay đổi ngữ nghĩa để trả về giá trị thay vì tham chiếu (trừ khi bạn trả về tham chiếu tùy chọn, nhưng tôi không thấy điều gì thêm vào con trỏ). –

+0

@Mike: Làm thế nào về 'tăng :: tùy chọn >'? – fredoverflow

1

Tôi muốn viết loại ngoại lệ (phân cấp, nếu cần) và ném ngoại lệ cho trường hợp như vậy.

1

Tôi chỉ thấy hai khả năng: hoặc bạn có một thành viên đặc biệt trong lớp MyList tuyên bố rằng một cá thể là "null" (không được đặt) hoặc bạn có thể ném một ngoại lệ.

+1

Có một thành viên trong 'MyList' để chỉ ra giá trị null có vẻ rất xâm nhập. Loại tính năng này thường đạt được tốt hơn bằng cách gói vật thể này thành vật thể khác. 'Boost.Optional ' cung cấp một trình bao bọc như vậy để biểu diễn một đối tượng nullable. –

1

Bạn có thể theo dõi số std::map của khách hàng tiềm năng và chèn danh sách được xây dựng mặc định vào vùng chứa của bạn và trả lại tham chiếu cho vùng chứa đó. Rõ ràng, điều này phụ thuộc vào việc không có sự khác biệt ngữ nghĩa giữa danh sách mặc định và danh sách không có ở đó.

Bạn cũng có thể thêm chức năng truy vấn tìm kiếm một vùng cụ thể và trả về true nếu có danh sách và ngược lại sai. Sau đó, bạn có thể ném một ngoại lệ trong accessor của bạn an toàn trong kiến ​​thức rằng nó sẽ không phải là một sự xuất hiện phổ biến.

3

Làm thế nào để viết lại hàm để tham chiếu đến "returnValue" trong đó bạn đưa danh sách trở lại? Sau đó, hàm có thể trả về giá trị boolean cho biết/không tìm thấy.

bool getListForThisRegion(/*region ID, ...*/, MyList& ret_list); 
Các vấn đề liên quan