std :: vector 구현을 사용하여 맞춤법 및 항목을 저장하려면 어떻게해야합니까?


10

지금 GameInstitute의 책을 따라 가고 있으며 다음과 같이 요구합니다.

플레이어가 치유 물약과 불 덩어리 물약을 사고 가지고 다닐 수있게하십시오. Item 클래스를 정의한 후 Item 배열을 Player 클래스에 추가하여 저장하거나 std :: vector를 사용하여 저장할 수 있습니다.

std::vector아이템 클래스를 만드는 것보다 덜 혼란스럽게 보이기 때문에 구현 을 사용하고 싶다고 생각 하지만 그렇게하는 방법을 잘 모르겠습니다. 많은 사람들이 벡터가 역동적 인 값 (예 : 아이템, 무기 등)을 저장하는 좋은 방법이라고 들었습니다.


3
어느 쪽이든 Item 클래스가 필요합니다. 항목 배열은 Item items [INVENTORY_SIZE]입니다. 항목의 std :: vector는 std :: vector <Item> items입니다. std :: vector는 동적으로 크기를 변경할 수있는 배열입니다.
API-Beast

1
벡터에 객체를 저장하려면 동일한 유형의 객체 여야합니다. 그렇게하는 방법은 아이템 벡터 (여기서 아이템은 선택할 수있는 모든 아이템에 대한 인터페이스 임)와 아이템 유형 (치유 물약과 불 덩어리 물약)에 대한 클래스를 만드는 것입니다. 물약 클래스가 Item 인터페이스를 구현하는 한 벡터에 저장할 수 있습니다 (물건이 복잡 해지더라도 소모품, 쌓을 수있는 아이템 또는 물약 자체와 같은 인터페이스를 추가 할 수 있습니다). 항목 당 하나의 클래스 및 항목 인터페이스)
Benjamin Danger Johnson

답변:


13

std::vector항목과 같은 "동적"항목을 저장하는 좋은 방법이지만 벡터의 실제 이점은 저장하는 항목 이 변경 될 수 있는 것이 아니라 벡터의 항목 수가 최소한으로 변경 될 수 있다는 것입니다 당신의 노력. 예를 들어, Item객체를 배열로 저장하려면 컴파일 타임 ( Item items[SIZE];)에 배열의 크기를 수정해야합니다. 즉 항목에 대한 상한이 고정되어 있음을 의미합니다 (다른 문제 중) 이 특정 주제와 관련이 있으므로 생략합니다.)

런타임 ( Item * items = new Item[SIZE];)에 배열을 동적으로 할당 할 수도 있습니다. 나중에 새 스토리지를 할당하고 항목을 복사하고 이전 스토리지를 삭제하여 배열의 크기를 조정할 수 있습니다. 그러나 이것은 당신이 할 일이 훨씬 더 많습니다.

다행스럽게도, std::vector그것은 당신을 위해하는 것입니다. 그것은 본질적으로 동적 크기의 배열 구현이며, 배열을 현재 용량 이상으로 확장하기 위해 메모리 관리를 처리합니다. 그것은 내가 지금 당신이 추구하는 제안하는 옵션입니다. 그러나 여전히 Item수업 을 만들고 싶을 것 입니다.

사용하기 매우 쉽습니다 :

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

vector클래스에 대한 MSDN 문서 는 아마 읽을 가치가 있으며, "아무것도"저장 하는 데 사용 되는 템플릿에 익숙하지 않은 vector경우 기본 사항도 참고해야합니다. 또한 마지막 포인트로 연결됩니다. 벡터가 무엇이든 저장할 수있는 것처럼 보이지만 허용되는 것에 대한 제약이 있으며 때로는 초보자를 던지기도합니다. 특히 벡터에 저장하는 유형은 복사 가능해야합니다. 예를 들어 벡터는 내부 저장소의 크기를 조정할 때 개체의 복사본을 만들어야하기 때문입니다. C ++ 의 세 규칙은 여기서 명심해야합니다.


고마워요, 이것은 명확하고 간결했습니다. 나는 지금 문서를 읽고 있습니다-15 명의 담당자가 있으면 다시 와서 투표하십시오!
블라디미르 마레 누스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.