Como posso armazenar magias e itens usando uma implementação std :: vector?

10

Estou acompanhando um livro do GameInstitute agora e está me pedindo para:

Permita que o jogador compre e carregue poções de cura e poções de bola de fogo. Você pode adicionar uma matriz Item (depois de definir a classe do item) à classe Player para armazená-los ou usar um std :: vector para armazená-los.

Eu acho que gostaria de usar a std::vectorimplementação, porque isso parece me confundir menos do que criar uma classe de item, mas não tenho certeza de como fazê-lo. Ouvi de muitas pessoas que vetores são ótimas maneiras de armazenar valores dinâmicos (como itens, armas etc.), mas não o vi usado.

Vladimir Marenus
fonte
3
Você precisará de uma classe Item nos dois sentidos. Uma matriz de itens seria itens de item [INVENTORY_SIZE]; Um std :: vector de itens seria std :: vector <Item> itens; Um std :: vector é apenas uma matriz cujo tamanho pode ser alterado dinamicamente.
API-Beast
1
Para armazenar objetos em um vetor, eles devem ser objetos do mesmo tipo. A maneira de fazer isso é criar um vetor Item (onde Item é uma interface para todos os itens que podem ser apanhados) e classes para cada um dos seus tipos de itens (poção de cura e poção de bola de fogo). Enquanto as classes de poções implementarem a interface Item, você poderá armazená-las no vetor (embora, à medida que as coisas se tornem mais complicadas, você queira adicionar mais interfaces para itens como itens consumíveis, itens empilháveis ​​ou apenas poções). uma classe por item e a interface Item)
Benjamin Danger Johnson

Respostas:

13

std::vectoré uma ótima maneira de armazenar coisas "dinâmicas" (como você as chama), como itens, mas o benefício real do vetor não é que o que você está armazenando pode mudar, mas que o número de itens no vetor pode mudar sem o mínimo esforço de sua parte. Para ilustrar, para armazenar seus Itemobjetos como uma matriz, é necessário fixar o tamanho da matriz no tempo de compilação ( Item items[SIZE];), o que significa que você tem um limite superior fixo para itens (entre outros problemas, que não são ' tão relevante para esse assunto específico e então eu vou pular sobre eles).

Você também pode alocar dinamicamente a matriz em tempo de execução ( Item * items = new Item[SIZE];), o que permitiria redimensionar a matriz mais tarde, alocando novo armazenamento, copiando os itens e excluindo o armazenamento antigo. Isso, no entanto, é muito mais trabalho para você fazer.

Felizmente, é isso que std::vectorfaz para você - é uma implementação de matriz de tamanho dinâmico, essencialmente, e lida com o gerenciamento de memória para aumentar a matriz além da capacidade atual para você. Definitivamente, é a opção que eu sugiro que você busque por enquanto - mas observe que você ainda deseja criar uma Itemclasse.

É muito fácil de usar:

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

A documentação do MSDN para a vectorclasse provavelmente vale a pena ser lida, e se você não estiver familiarizado com os modelos - que é o que vectorusa para permitir que ele armazene "qualquer coisa" -, você deve atualizar o básico também. O que também me leva a um ponto final: embora pareça que um vetor pode armazenar qualquer coisa, ele tem restrições para o que é permitido nele e, às vezes, são iniciantes. Em particular, o tipo que você armazena em um vetor deve ser copiável, porque o vetor precisará fazer uma cópia dos objetos ao redimensionar seu armazenamento interno, por exemplo. A regra dos três em C ++ é algo a ser lembrado aqui.


fonte
Obrigado, isso foi claro e conciso. Estou lendo a documentação agora. Quando eu tiver 15 representantes, certificarei-me de voltar e votar em você!
Vladimir Marenus 5/11