Come posso conservare incantesimi e oggetti usando un'implementazione std :: vector?


10

Sto seguendo un libro di GameInstitute in questo momento e mi sta chiedendo di:

Consenti al giocatore di acquistare e trasportare pozioni curative e pozioni di palla di fuoco. Puoi aggiungere un array di oggetti (dopo aver definito la classe di oggetti) alla classe Player per memorizzarli, oppure usare uno std :: vector per memorizzarli.

Penso che mi piacerebbe usare l' std::vectorimplementazione, perché questo mi confonde meno che creare una classe di articoli, ma non sono sicuro di come farlo. Ho sentito da molte persone che i vettori sono ottimi modi per memorizzare valori dinamici (come oggetti, armi, ecc.), Ma non l'ho visto usato.


3
Avrai bisogno di una classe di oggetti in entrambi i modi. Un array di articoli sarebbe Item item [INVENTORY_SIZE]; Un std :: vector di elementi sarebbe std :: vector <Item> items; Uno std :: vector è solo un array le cui dimensioni possono essere modificate in modo dinamico.
API-Beast

1
Per memorizzare oggetti in un vettore devono essere oggetti dello stesso tipo. Il modo per farlo è quello di creare un vettore oggetto (in cui l'oggetto è un'interfaccia per tutti gli oggetti che possono essere raccolti) e le classi per ciascuno dei tipi di oggetto (pozione curativa e pozione palla di fuoco). Fintanto che le classi di pozioni implementano l'interfaccia Oggetto, puoi memorizzarle nel vettore (anche se man mano che le cose diventano più complicate potresti voler aggiungere più interfacce per cose come oggetti consumabili, oggetti impilabili o solo pozioni stesse. Ma per semplicità fai semplicemente una classe per articolo e l'interfaccia dell'articolo)
Benjamin Danger Johnson,

Risposte:


13

std::vectorè un ottimo modo per memorizzare oggetti "dinamici" (come li chiami) come oggetti, ma il vero vantaggio del vettore non è che la cosa che stai memorizzando può cambiare, ma che il numero di oggetti nel vettore può cambiare senza minimo sforzo da parte tua. Per illustrare, se avessi dovuto archiviare i tuoi Itemoggetti come un array, dovresti correggere le dimensioni dell'array in fase di compilazione ( Item items[SIZE];), il che significa che hai un limite superiore fisso per gli elementi (tra gli altri problemi, che non sono ' t rilevante per questo argomento specifico e quindi li salterò).

È inoltre possibile allocare dinamicamente l'array in fase di runtime ( Item * items = new Item[SIZE];), il che consentirebbe di ridimensionare l'array in un secondo momento allocando nuovo spazio di archiviazione, copiando gli elementi ed eliminando il vecchio archivio. Questo, tuttavia, richiede molto più lavoro.

Fortunatamente, questo è ciò che std::vectorfa per te: si tratta di un'implementazione di array di dimensioni dinamiche, in sostanza, e gestisce la gestione della memoria per far crescere l'array oltre la sua attuale capacità. È sicuramente l'opzione che ti suggerirei di perseguire per ora, ma tieni presente che vorrai comunque creare una Itemclasse.

È molto facile da usare:

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

La documentazione MSDN per la vectorclasse merita probabilmente una lettura e, se non si ha familiarità con i modelli , che è ciò vectorche consente di archiviare "qualsiasi cosa", è necessario ripassare le basi anche lì. Il che mi porta anche ad un ultimo punto: mentre sembra che un vettore possa memorizzare qualsiasi cosa, ha dei vincoli per ciò che è permesso in esso e questi a volte gettano i principianti. In particolare, il tipo che memorizzi in un vettore deve essere copiabile, perché il vettore dovrà fare una copia degli oggetti quando ridimensiona la sua memoria interna, ad esempio. La regola dei tre C ++ è qualcosa da tenere a mente qui.


Grazie, questo è stato chiaro e conciso. Sto leggendo la documentazione ora- Quando avrò 15 rappresentanti, mi assicurerò di tornare e votarti!
Vladimir Marenus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.