2011-09-25 16 views
10

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 itwould waste space and possibly lead to surprising the user due to extra Ts existing that the user didn't explicitly create?

Trả lời

7

Nếu không có lớp trợ giúp, nút gốc của danh sách sẽ chứa một phiên bản T không bao giờ được sử dụng. Câu thứ hai là nói rằng bạn có thể không mong đợi một danh sách trống để tạo ra một T. Ví dụ, việc tạo ra một T có thể có các tác dụng phụ.

1

Dường như với tôi rằng ý tưởng là tách biệt sự trừu tượng của danh sách, khỏi dữ liệu mà nó mang theo. Bạn chỉ cần ListNode khi bạn thực sự muốn truy cập dữ liệu, tất cả phần còn lại có thể được thực hiện trên abstract ListNodeBase. Đó là cách tôi hiểu số list anchor node doesn't carry a T with it.

Có điều gì đó về không gian. Các lớp mẫu được tạo cho mỗi loại, vì vậy nếu bạn có một số loại khác nhau được sử dụng cho T, không có ListNodeBase, bạn sẽ tạo các bản sao templated của tất cả các hoạt động cho mỗi loại, với nó - bạn không, và LinkNode kế thừa chúng và chỉ yêu cầu bộ nhớ cho dữ liệu thực tế. Dường như không gian lưu được đề cập đến kích thước thực tế của mã trong trường hợp này.

+0

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. –

+0

@ 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

+0

Tôi đã xem. Theo như tôi có thể nói, 'list' * chứa * sentinel, tại dòng' base_node_type mNode; '. –

1

Bạn thực sự muốn hỗ trợ danh sách trống. Nếu nút đầu chính nó luôn chứa một T, và mỗi danh sách chứa một nút đầu, sau đó nó theo sau mỗi danh sách chứa ít nhất một T, và do đó không bao giờ có thể trống.

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