생각해보니 아이템 전체를 배열로 받을 친구는 Shop밖에없다. 그래서 나는 그냥 Shop을 생성할 때 모든 아이템을 담을 포인트를 저장하는 배열을 만들고 거기에 아이템들을 추가시켜줄 생각이다.
처음에는 그냥 vector를 헤더파일에서 선언하고
vector<Item> all_items;//모든 아이템 저장 백터
vector<Item> items_for_sale;//판매할 아이템
vector<Item> RandomItem();// 아이템을 랜덤으로 선택
이렇게 넣어주고
Shop::Shop()
{
all_items.push_back(new Sword40());
all_items.push_back(new VampiricDagger());
all_items.push_back(new HP_Blade4());
all_items.push_back(new HealingArmor());
items_for_sale = RandomItem();
}
이렇게 push_back을 해주면....
안된다
그 이유는...!
#pragma once
#include <iostream>
#include <string>
using namespace std;
//아이템
class Item
{
protected:
string name;
int weight;
int price;
int attack;
int health;
public:
Item(const string& name, int weight, int price, int attack, int health)
: name(name), weight(weight), price(price), attack(attack), health(health) {
}
const string& GetName() { return this->name; }
int GetWeight() const { return weight; }
int GetPrice() const { return price; }
virtual int GetAttack() { return attack; } //공격력 리턴
virtual int GetHealth() { return health; } //체력 리턴
virtual void UseItem() { return; } //사용 효과
virtual void StartFight() { return; } //전투 시작시
virtual void EndFight() { return; } //전투 종료시
virtual ~Item() {}
};
아이템 친구들에 들어가는 매개변수들이 전부 다 protected로 안전하게 보호돼있기 때문에 직접 접근해서 사용하는게 안되기 때문이다.
그래서 우리는 그 주소값을 가져와서 넣어줄 생각이다. 즉 포인터를 사용한다는 것이다
포인터를 사용할 때의 장점
- 다형성: 포인터를 사용하면 기본 클래스인 Item의 포인터를 통해 다양한 서브클래스를 다룰 수 있습니다. 이는 다형성을 활용할 수 있게 해줍니다.
- 메모리 관리: 동적으로 할당된 객체를 관리할 수 있으며, 필요에 따라 소멸자를 통해 메모리를 해제할 수 있습니다.
- 성능: 포인터를 사용하면 객체를 복사하는 대신 주소를 전달하므로 성능이 향상될 수 있습니다.
우선은 헤더파일먼저 바꿔주겠다
vector<Item*> all_items;//모든 아이템 저장 백터
vector<Item*> items_for_sale;//판매할 아이템
vector<Item*> RandomItem();// 아이템을 랜덤으로 선택
모든 아이템을 저장한 다음에 아이템을 랜덤으로 선택하여 판매할 아이템 백터에 넣어줄 것이다.
그리고
//생성자
Shop::Shop()
{
all_items.push_back(new Sword40());
all_items.push_back(new VampiricDagger());
all_items.push_back(new HP_Blade4());
all_items.push_back(new HealingArmor());
items_for_sale = RandomItem();
}
// 랜덤으로 아이템 뽑기 함수
vector<Item*> Shop::RandomItem()
{
srand(static_cast<unsigned int>(time(0))); // 랜덤 시드 설정
random_shuffle(all_items.begin(), all_items.end()); // 배열 섞기
return vector<Item*>(all_items.begin(), all_items.begin() + 3); // 3개 선택해서 반환
}
반환값도 포인터 배열로 해주면 items_for_sale에는 값이 잘 담긴다.
그 다음
void Shop::BuyItem()
{
cout << "구매 가능한 아이템 : " << endl;
for (size_t i = 0; i < items_for_sale.size(); i++)
{
cout << i + 1 << "." << items_for_sale[i]->GetName()
<< ": 가격 " << items_for_sale[i]->GetPrice()
<< ", 무게 " << items_for_sale[i]->GetWeight() << endl;
}
cout << "4.뒤로가기" << endl;
cout << "구매할 아이템을 선택하세요 : " << endl;
int choice;
cin >> choice;
아이템 구매 함수도 items_for_sale[i].GetName()에서 items_for_sale[i]->GetName()로 바꿔준다면
잘 된다... 포인터때문에 많이 돌아갔기 때문에 다음엔 또 조심해야겠다.
'C++' 카테고리의 다른 글
[프로그래머스] 3진법 변환 후 뒤집어 10진법 변환 (0) | 2025.02.05 |
---|---|
C++[텍스트 RPG에서 상점 만들기(2. 구매, 판매)] (0) | 2025.01.13 |
C++ [텍스트 RPG에서 상점 만들기(1. 플로우차트, 상점 입장)] (0) | 2025.01.10 |
C++[클래스를 이용해 동물소리 출력] (0) | 2024.12.26 |
C++ [오름차순과 내림차순 정렬] (1) | 2024.12.24 |