Yazım ve öğeleri bir std :: vector uygulaması kullanarak nasıl saklayabilirim?


10

Şu anda GameInstitute'tan bir kitap takip ediyorum ve benden şunları yapmamı istiyor:

Oyuncunun şifa iksirleri ve ateş topu iksirleri almasına ve taşımasına izin verin. Bunları saklamak için Player sınıfına bir Item dizisi (item sınıfını tanımladıktan sonra) ekleyebilir veya saklamak için bir std :: vector kullanabilirsiniz.

std::vectorUygulamayı kullanmak istediğimi düşünüyorum , çünkü bu beni bir madde sınıfı yapmaktan daha az karıştırıyor gibi görünüyor, ancak bunu nasıl yapacağımdan emin değilim. Birçok insandan, vektörlerin dinamik değerleri (öğeler, silahlar, vb.) Saklamanın harika yolları olduğunu duydum, ancak kullanıldığını görmedim.


3
Her iki şekilde de bir Item sınıfına ihtiyacınız olacak. Bir öğe dizisi Öğe öğeleri olacaktır [INVENTORY_SIZE]; Std :: öğelerin vektörü std :: vektör <Item> öğeleri olacaktır; Std :: vector, boyutu dinamik olarak değiştirilebilen bir dizidir.
API-Beast

1
Nesneleri bir vektörde saklamak için aynı türden nesneler olmalıdır. Bunu yapmanın yolu, bir Öğe vektörü (burada Öğe, alınabilecek tüm öğeler için bir arayüzdür) ve öğe türlerinizin her biri için (iyileştirici iksir ve ateş topu iksiri) sınıflar oluşturmaktır. İksir sınıfları Öğe arayüzünü uyguladığı sürece bunları vektörde saklayabilirsiniz (işler daha karmaşık hale gelmesine rağmen, sarf malzemeleri, istiflenebilir öğeler veya sadece iksirler gibi şeyler için daha fazla arayüz eklemek isteyebilirsiniz. öğe başına bir sınıf ve Öğe arayüzü)
Benjamin Danger Johnson

Yanıtlar:


13

std::vector"dinamik" (onları çağırırken) öğeleri gibi şeyleri depolamanın iyi bir yoludur, ancak vektörün gerçek yararı, depoladığınız şeyin değişebileceği değil , vektördeki öğe sayısının minimum olmadan değişebileceğidir çaba. Örneklemek gerekirse, Itemnesnelerinizi bir dizi olarak depolamak zorunda olsaydınız, dizinin boyutunu derleme zamanında ( Item items[SIZE];) düzeltmeniz gerekir ; bu, öğeler üzerinde sabit bir üst sınırınız olduğu anlamına gelir. t Bu konu ile ilgili olarak, bu yüzden onları atlayacağım).

Ayrıca runtime ( Item * items = new Item[SIZE];) dizisini daha sonra yeni depolama alanı ayırarak, öğeleri kopyalayarak ve eski depolamayı silerek diziyi yeniden boyutlandırmanıza olanak tanıyacak şekilde dinamik olarak ayırabilirsiniz . Ancak bu sizin için çok daha fazla iştir.

Neyse ki, std::vectorsizin için budur - dinamik olarak bir dizi uygulamasıdır, ve aslında diziyi sizin için mevcut kapasitesinin ötesine büyütmek için bellek yönetimini yönetir. Kesinlikle şimdilik takip etmenizi önereceğim seçenek - ancak yine de bir Itemsınıf oluşturmak isteyeceğinizi unutmayın .

Kullanımı çok kolay:

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

vectorSınıfın MSDN belgeleri muhtemelen okunmaya değerdir ve şablonlara aşina değilseniz - vector"herhangi bir şeyi" saklamak için kullanılan şey budur - buradaki temel bilgileri de fırçalamanız gerekir. Bu da beni son bir noktaya götürüyor: bir vektör her şeyi saklayabilir gibi görünse de, içinde izin verilenler için kısıtlamaları var ve bunlar bazen yeni başlayanlar atıyor. Özellikle, bir vektörde sakladığınız türün kopyalanması gerekir, çünkü vektörün örneğin dahili depolamasını yeniden boyutlandırırken nesnelerin bir kopyasını alması gerekir. C ++ 'ın üç kuralı burada akılda tutulması gereken bir şey.


Teşekkürler, bu açık ve özlüdür. Şimdi belgeleri okuyorum- 15 temsilcim olduğunda, geri dönüp sana oy vereceğimden emin olacağım!
Vladimir Marenus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.