C++

C++[아이템을 다른 헤더파일에서 가져와서 사용하기]

jeongchanhyo 2025. 1. 14. 21:02

생각해보니 아이템 전체를 배열로 받을 친구는 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()로 바꿔준다면 

 

잘 된다... 포인터때문에 많이 돌아갔기 때문에 다음엔 또 조심해야겠다.