Làm cách nào tôi có thể lưu trữ chính tả & vật phẩm bằng cách sử dụng triển khai std :: vector?


10

Tôi đang theo dõi cùng với một cuốn sách từ GameInstolarship ngay bây giờ và nó đang yêu cầu tôi:

Cho phép người chơi mua và mang theo bình thuốc chữa bệnh và bình thuốc chữa cháy. Bạn có thể thêm một mảng Item (sau khi bạn xác định lớp vật phẩm) vào lớp Player để lưu trữ chúng hoặc sử dụng vector std :: để lưu trữ chúng.

Tôi nghĩ rằng tôi muốn sử dụng việc std::vectorthực hiện, bởi vì điều đó dường như làm tôi bối rối hơn là tạo một lớp vật phẩm, nhưng tôi không chắc làm thế nào để làm điều đó. Tôi đã nghe từ nhiều người rằng vectơ là cách tuyệt vời để lưu trữ các giá trị động (như vật phẩm, vũ khí, v.v.), nhưng tôi chưa thấy nó được sử dụng.


3
Bạn sẽ cần một lớp Item theo bất kỳ cách nào. Một mảng các mặt hàng sẽ là các mục Vật phẩm [INVENTORY_SIZE]; Một std :: vector của các mục sẽ là std :: vector <Item> các mục; Một std :: vector chỉ là một mảng có thể thay đổi kích thước một cách linh hoạt.
API-Beast

1
Để lưu trữ các đối tượng trong một vectơ, chúng phải là các đối tượng cùng loại. Cách để làm điều đó là tạo một vectơ Vật phẩm (trong đó Vật phẩm là giao diện cho tất cả các vật phẩm có thể nhặt được) và các lớp cho từng loại vật phẩm của bạn (thuốc chữa bệnh và thuốc chữa cháy). Miễn là các lớp thuốc thực hiện giao diện Item, bạn có thể lưu trữ chúng trong vector (mặc dù khi mọi thứ trở nên phức tạp hơn, bạn có thể muốn thêm nhiều giao diện cho những thứ như vật phẩm tiêu hao, vật phẩm có thể xếp chồng hoặc chỉ là thuốc độc. một lớp cho mỗi vật phẩm và giao diện Vật phẩm)
Benjamin Danger Johnson

Câu trả lời:


13

std::vectorlà một cách tốt để lưu trữ "động" (như bạn gọi chúng) những thứ như vật phẩm, nhưng lợi ích thực sự của vectơ không phải là thứ bạn đang lưu trữ có thể thay đổi, mà là số lượng vật phẩm trong vectơ có thể thay đổi mà không cần tối thiểu nỗ lực từ phía bạn. Để minh họa, bạn đã lưu trữ các Itemđối tượng của mình dưới dạng một mảng, bạn phải sửa kích thước của mảng tại thời gian biên dịch ( Item items[SIZE];), có nghĩa là bạn có giới hạn trên cố định đối với các mục (trong số các vấn đề khác, điều này không xảy ra ' t có liên quan đến chủ đề cụ thể này và vì vậy tôi sẽ bỏ qua chúng).

Bạn cũng có thể tự động phân bổ mảng trong thời gian chạy ( Item * items = new Item[SIZE];) sẽ cho phép bạn thay đổi kích thước mảng sau bằng cách phân bổ bộ nhớ mới, sao chép các mục qua và xóa bộ nhớ cũ. Điều này, tuy nhiên, là rất nhiều công việc để bạn làm.

May mắn thay, đó là những gì std::vectorlàm cho bạn - về cơ bản, đó là một triển khai mảng có kích thước động, và xử lý việc quản lý bộ nhớ để phát triển mảng vượt quá khả năng hiện tại của nó đối với bạn. Đây chắc chắn là tùy chọn mà tôi khuyên bạn nên theo đuổi ngay bây giờ - nhưng lưu ý rằng bạn vẫn muốn tạo một Itemlớp.

Nó rất dễ sử dụng:

// Create an item list and two item objects to add to it.
std::vector<Item> items;
Item fireballPotion("Potion of Fireball");
Item healingPotion("Potion of Healing");

// Add the items:
items.push_back(fireballPotion);
items.push_back(healingPotion);

// operator[] is supported for accessing items.
// This will print "Potion of Fireball" for example:
std::cout << items[0].GetName();

Tài liệu MSDN cho vectorlớp có lẽ đáng để đọc và nếu bạn không quen thuộc với các mẫu - đó là những gì vectorsử dụng để cho phép nó lưu trữ "bất cứ thứ gì" - bạn cũng nên tìm hiểu những điều cơ bản ở đó. Điều này cũng dẫn tôi đến một điểm cuối cùng: mặc dù có vẻ như một vectơ có thể lưu trữ bất cứ thứ gì, nhưng nó có những ràng buộc cho những gì được cho phép trong đó và đôi khi những người mới bắt đầu ném. Cụ thể, loại bạn lưu trữ trong một vectơ phải có thể sao chép được, vì vectơ sẽ cần tạo một bản sao của các đối tượng khi thay đổi kích thước bộ nhớ trong của nó, ví dụ. Quy tắc ba của C ++ là điều cần lưu ý ở đây.


Cảm ơn bạn, điều này là rõ ràng và súc tích. Bây giờ tôi đang đọc tài liệu này - Khi tôi có 15 đại diện, tôi chắc chắn sẽ quay lại và bỏ phiếu cho bạn!
Vladimir Marenus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.