Bagaimana cara menyimpan mantra & item menggunakan penerapan std :: vector?


10

Saya mengikuti bersama dengan buku dari GameInstitute sekarang, dan itu meminta saya untuk:

Biarkan pemain membeli dan membawa ramuan penyembuh dan ramuan bola api. Anda bisa menambahkan array Item (setelah Anda menentukan kelas item) ke kelas Player untuk menyimpannya, atau menggunakan std :: vector untuk menyimpannya.

Saya pikir saya ingin menggunakan std::vectorimplementasinya, karena itu agak membingungkan saya daripada membuat kelas item, tetapi saya tidak yakin bagaimana melakukannya. Saya telah mendengar dari banyak orang bahwa vektor adalah cara terbaik untuk menyimpan nilai dinamis (seperti barang, senjata, dll), tetapi saya belum melihatnya menggunakannya.


3
Anda membutuhkan kelas Item dengan cara apa pun. Array item adalah Item item [INVENTORY_SIZE]; Std :: vektor item akan menjadi std :: vektor item <Item> ; Std :: vector hanyalah sebuah array yang ukurannya dapat diubah secara dinamis.
API-Beast

1
Untuk menyimpan objek dalam vektor, mereka harus objek dengan tipe yang sama. Cara untuk melakukannya adalah dengan membuat vektor Item (di mana Item adalah antarmuka untuk semua item yang dapat diambil) dan kelas untuk setiap jenis item Anda (ramuan penyembuhan dan ramuan bola api). Selama kelas ramuan mengimplementasikan antarmuka Item, Anda dapat menyimpannya dalam vektor (meskipun hal-hal menjadi lebih rumit, Anda mungkin ingin menambahkan lebih banyak antarmuka untuk hal-hal seperti barang habis pakai, barang yang dapat ditumpuk, atau hanya ramuan sendiri. Tetapi untuk kesederhanaan hanya membuat satu kelas per item dan antarmuka Item)
Benjamin Danger Johnson

Jawaban:


13

std::vectoradalah cara yang baik untuk menyimpan "dinamis" (seperti Anda menyebutnya) hal-hal seperti barang, tetapi manfaat sebenarnya dari vektor bukanlah bahwa hal yang Anda simpan dapat berubah, tetapi bahwa jumlah item dalam vektor dapat berubah tanpa minimal usaha Anda. Untuk mengilustrasikan, jika Anda harus menyimpan Itemobjek Anda sebagai array, Anda harus memperbaiki ukuran array pada waktu kompilasi ( Item items[SIZE];), yang berarti Anda memiliki batas atas tetap pada item (antara masalah lain, yang tidak t relevan dengan subjek khusus ini dan saya akan mengabaikannya).

Anda juga dapat secara dinamis mengalokasikan array saat runtime ( Item * items = new Item[SIZE];) yang akan memungkinkan Anda mengubah ukuran array nanti dengan mengalokasikan penyimpanan baru, menyalin item, dan menghapus penyimpanan yang lama. Namun, ini lebih banyak pekerjaan yang harus Anda lakukan.

Untungnya, itulah yang std::vectorAnda lakukan - ini adalah implementasi array berukuran dinamis, pada dasarnya, dan menangani manajemen memori untuk menumbuhkan array di luar kapasitas saat ini untuk Anda. Ini jelas merupakan opsi yang saya sarankan untuk Anda kejar sekarang - tetapi perhatikan bahwa Anda masih ingin membuat Itemkelas.

Ini sangat mudah digunakan:

// 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();

Dokumentasi MSDN untuk vectorkelas mungkin layak dibaca, dan jika Anda tidak terbiasa dengan templat - yang vectordigunakan untuk memungkinkannya menyimpan "apa pun" - Anda harus membaca dasar-dasar di sana juga. Yang juga menuntun saya ke titik akhir: meskipun terlihat seperti vektor dapat menyimpan apa pun, ia memang memiliki kendala untuk apa yang diizinkan di dalamnya dan ini terkadang melempar pemula. Secara khusus, jenis yang Anda simpan dalam vektor harus dapat disalin, karena vektor tersebut perlu membuat salinan objek ketika mengubah ukuran penyimpanan internal, misalnya. Aturan C ++ dari tiga adalah sesuatu yang perlu diingat di sini.


Terima kasih, ini jelas dan singkat. Saya membaca dokumentasi sekarang- Ketika saya memiliki 15 perwakilan, saya akan pastikan untuk kembali dan memilih Anda!
Vladimir Marenus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.