2017-08-30 14 views
5

Giả sử chúng tôi đang triển khai bộ sưu tập tùy chỉnh hoạt động giống như vectơ và chúng tôi muốn thực hiện operator[] trừ một số ngoại lệ nếu bộ sưu tập trống. std::vector có hành vi không xác định trong trường hợp này nhưng chúng tôi muốn ném ngoại lệ. Nếu đây là C#, chúng tôi có thể sẽ ném InvalidOperationException. Nhưng C++ exception nào là phù hợp nhất/trực quan trong trường hợp này? Tôi cảm thấy std::out_of_range sẽ không phải là lựa chọn tốt nhất vì bộ sưu tập trống nên không có 'phạm vi' để lập chỉ mục sẽ trả lại phần tử hợp lệ (bất kỳ) nào.Ngoại lệ nào để ném khi trạng thái hiện tại của đối tượng không cho phép thao tác trên đó?

+2

Thực ra tôi nghĩ 'std :: out_of_range' thực sự sẽ là ngoại lệ mà tôi sẽ sử dụng. Nếu vùng chứa trống, thì bất kỳ chỉ mục nào nằm ngoài phạm vi, giống như cách 'std :: vector' đã hoạt động. Hãy nhớ rằng một tập rỗng vẫn là một tập hợp (theo nghĩa toán học) – CoryKramer

+0

IMHO Tôi nghĩ mọi người sẽ hiểu cách bạn sử dụng 'std :: out_of_range'. Ngay cả trang web tham chiếu bạn liên kết cũng có * Xác định loại đối tượng cần được loại trừ là ngoại lệ. Nó báo cáo lỗi là hậu quả của việc cố gắng truy cập các phần tử ngoài phạm vi được xác định. * Tương thích tốt với tình huống này. – NathanOliver

+2

'vector :: at' sẽ ném' std :: out_of_range' khi vectơ trống, vì vậy tôi tin rằng đó thực sự là ngoại lệ chính xác để sử dụng. – SirDarius

Trả lời

4

std::vector::at đã thực hiện việc này. Vì vậy, bạn có thể sử dụng phương pháp at thay vì operator []. Nó ném std::out_of_range cho chỉ mục không hợp lệ.

Xin lưu ý rằng bạn sẽ phải thực hiện công việc quan trọng để đạt được hiệu suất của std::vector. Nhưng vẫn còn nếu bạn muốn dính vào container của riêng bạn và muốn ném từ [] thì giống như phương thức atstd::out_of_range là lựa chọn tốt nhất trong số các lớp ngoại lệ tiêu chuẩn. Nếu không, bạn cần xác định lớp ngoại lệ tùy chỉnh của riêng bạn.

+1

Cảm ơn @taskinoor. Tôi đã triển khai bộ sưu tập tùy chỉnh này như một bài tập ... nên đây là một câu hỏi giả định hơn. Tôi chắc chắn sẽ tránh làm điều đó trong trường hợp của phần mềm thương mại/sản xuất trừ khi có một lý do rất tốt để làm điều đó. –

+1

@BojanKomazec vì mục đích học tập là hoàn toàn ổn, IMHO. Tắt bình luận chủ đề: xin hãy xem 'std :: allocator' mà bạn có thể cần tránh việc gọi không cần thiết của các nhà xây dựng mặc định và di chuyển ngữ nghĩa mà bạn có thể cần cho hoạt động phát triển hiệu quả. – taskinoor

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