26.05.12
기존에는 main.cpp 안에서 모든 스탯과 직업 로직을 직접 관리했다.
하지만 코드가 길어지고 직업별 기능이 늘어나면서:
문제가 생기기 시작했다.
그래서 Player 클래스를 부모 클래스로 만들고
직업별 클래스를 상속받도록 구조를 변경했다.
class Player
{
protected:
string _name;
string _job;
int _hp;
int _mp;
int _atk;
int _def;
int _level;
public:
virtual void attack() = 0;
virtual ~Player() {}
};
class Warrior : public Player
{
public:
Warrior(string name,
int hp,
int mp,
int atk,
int def);
void attack() override;
};
virtual void attack() = 0;
"모든 직업은 반드시 attack()을 구현해야 한다"
이렇게 하면 Player는 추상 클래스(Abstract Class)가 된다.
Player player;
처럼 직접 생성은 불가능하다.
void attack() override;
override는 부모 virtual 함수 재정의 여부를 검사
오타나 함수명 실수를 방지할 수 있다.
직업 선택 후 Player* player = nullptr; 를 선언하고, player = new Warrior(...); 형태로 동적 할당을 사용했다.
부모 포인터 하나로 모든 객체를 관리할 수 있다.
new로 생성한 객체는 직접 메모리 해제를 해야 한다.
delete player;
player = nullptr;
delete를 하지 않으면 메모리 누수(memory leak) 가 발생할 수 있다. 또한 삭제 후 player = nullptr; 를 통해 dangling pointer를 방지할 수 있다.
부모 클래스는 공통 데이터와 기능 관리
자식 클래스는 직업별 특징 구현
잘못 사용할 시