Ví dụ, kiếm và rìu là hai lớp khác nhau, cả hai đều thừa hưởng từ vũ khí. Vũ khí và thuốc cũng là những lớp khác nhau cả hai kế thừa từ vật phẩm.
Tôi sẽ không làm mọi thứ theo cách này; một thanh kiếm và rìu khác nhau chủ yếu trong dữ liệu của họ, không phải là hành vi cơ bản của họ như vũ khí. Tương tự như vậy với các mặt hàng. Tôi sẽ tránh việc lạm dụng quyền thừa kế này, bắt đầu bằng cách giới hạn bản thân mình Weapon
và Item
(bạn thậm chí có thể xếp chúng vào một lớp duy nhất, nhưng đó là một cuộc thảo luận khác). Nếu không có gì khác, điều này sẽ làm giảm bớt vụ nổ của nhà xây dựng mà bạn đang thấy ItemWrapper
.
Vì vậy, nó phải là một thùng chứa các con trỏ vật phẩm (thông minh). Vì tôi không muốn đọc mã của mình bằng các lệnh gọi mới và xóa, tôi sẽ bọc nó trong một lớp ItemWrapper có tin tức / xóa trên ctor / dtor.
Hãy xem xét Boost con trỏ thông minh thay vì tự lăn. Chúng khá tách biệt với phần còn lại của Boost (vì vậy bạn không có quá nhiều sự phụ thuộc để tham gia nếu vì lý do nào đó, bạn không muốn tận dụng phần còn lại của công cụ gọn gàng của Boost) và nhiều chúng đã được chấp nhận là một phần của thư viện tiêu chuẩn mới trong C ++ 11, vì vậy bạn không nên gặp vấn đề nâng cấp.
Đây là nỗ lực đầu tiên của tôi ở đây, vì vậy tôi muốn biết: tôi có đi đúng hướng không? hoặc nếu có một cách tốt hơn để làm điều đó (có lẽ là một cách tránh rất nhiều nhà xây dựng)?
Như trên, tôi sẽ cố gắng tránh kế thừa cho việc này và xem xét sử dụng các giải pháp của bên thứ ba đã được thiết lập thay vì tự mình thực hiện. Những bước đó một mình sẽ loại bỏ phần lớn sự phức tạp bảo trì mà bạn đang khám phá (hoặc sẽ sớm khám phá).
Điều đó nói rằng, một cách tiếp cận khác là xem xét nó theo cách này: ItemWrapper
là một hỗ trợ ban nhạc cho một vấn đề chi tiết thực hiện. Bản thân nó không đại diện cho một "đối tượng" thực sự theo bất kỳ ý nghĩa điển hình nào. Vì vậy, hãy suy nghĩ về những gì có thể là một sự tương tự tốt hơn cũng giải quyết vấn đề của bạn là có một nơi để đặt tự động new
và delete
các cuộc gọi.
Hầu hết hàng tồn kho cho phép (một số) vật phẩm xếp chồng lên nhau, phải không?
"Khả năng xếp chồng" của một vật phẩm là một thuộc tính của vật phẩm đó, nhưng bản thân vật phẩm đó không chịu trách nhiệm duy trì ngăn xếp. Nếu bạn có một lớp đại diện cho một ItemStack
phương thức để truy vấn kích thước của ngăn xếp, tách ngăn xếp, et cetera thì bạn có thể đặt quyền quản lý vòng đời của con trỏ vật phẩm (mà tôi cần lưu ý, có thể trở nên phức tạp hơn một chút với các ngăn xếp , do đó cung cấp một đối số khác để sử dụng một cái gì đó như Boost) trong lớp stack cùng với việc thực hiện phần còn lại của hành vi của nó. Các mục không thể xếp chồng được thể hiện bằng một ngăn xếp luôn chứa một mục duy nhất và bản thân kho lưu trữ của bạn vẫn xử lý các trường hợp đồng nhất của ItemStack
.