Tôi đã trải qua EASTL's list class để xem cách tác giả đã triển khai các nút. Kỳ vọng của tôi là một lớp/cấu trúc đơn giản. Thay vào đó, tôi thấy một cơ sở và một nút được kế thừa từ cơ sở này (vẫn còn đơn giản, nhưng tại sao lại là hai lớp?). Bình luận của ông giải thích tại sao:Có phải một loại mẫu không gian chất thải trong C++?
Chúng ta định nghĩa một ListNodeBase tách biệt khỏi ListNode (dưới đây), vì nó cho phép chúng tôi để có các hoạt động phi templated như chèn, loại bỏ (dưới đây), và nó làm cho nó sao cho danh sách nút neo không mang theo một T với nó, mà sẽ không gian lãng phí và có thể dẫn đến gây ngạc nhiên cho người dùng do thêm Ts hiện có mà người dùng đã không tạo ra một cách rõ ràng. Nhược điểm cho tất cả điều này là nó làm cho việc xem lỗi của một danh sách khó hơn, với điều kiện các nút con trỏ là loại ListNodeBase và không phải là ListNode. Tuy nhiên, hãy xem ListNodeBaseProxy bên dưới.
Tôi không hiểu một vài điều ở đây. Tôi làm hiểu phần về lý do tại sao nó sẽ làm cho việc gỡ lỗi xem khó hơn một chút, nhưng ý của anh ta là gì? list anchor node doesn't carry a T with it
và would waste space and possibly lead to surprising the user due to extra Ts existing that the user didn't explicitly create
?
Bạn không sử dụng danh sách không có dữ liệu. Có một nút duy nhất được gọi là ** nút neo ** hoặc ** sentinel ** hiện diện trong mỗi cá thể của danh sách, ngay cả trong danh sách trống, để loại bỏ một số mã trường hợp đặc biệt được liên kết với danh sách trống. Đó là một nút này không cần chứa dữ liệu của người dùng. –
@ n.m. đó sẽ là lớp 'danh sách', bạn có thể xem xét việc thực hiện tại liên kết OP được đăng. Vì bản thân 'list' là phần tử gửi, điểm moot. – littleadv
Tôi đã xem. Theo như tôi có thể nói, 'list' * chứa * sentinel, tại dòng' base_node_type mNode; '. –