#include<iostream>
using namespace std;
class Marin {
int hp;
int coord_x, coord_y;
int damage;
bool is_dead;
char* name;
public:
Marin();
Marin(int x, int y, const char* marin_name);
int attack();
void be_attacked(int damage);
void move(int x, int y);
void show_status();
~Marin();
};
Marin :: Marin() {
hp = 100;
coord_x = 0;
coord_y = 0;
damage = 10;
is_dead = false;
}
Marin::Marin(int x, int y, const char* marin_name) {
name = new char[strlen(marin_name) + 1];
strcpy(name, marin_name);
hp = 100;
coord_x = x;
coord_y = y;
damage = 10;
}
void Marin::move(int x, int y) {
coord_x = x;
coord_y = y;
}
int Marin::attack(){
return damage;
}
void Marin::be_attacked(int income_damage) {
hp -= income_damage;
if (hp <= 0) is_dead = true;
}
void Marin::show_status() {
cout << "*** Marin | " << name << " ***" << endl;
cout << "HP: " << hp << endl;
cout << "LOCATION: " << coord_x << ", " << coord_y << endl;
}
Marin::~Marin() {
cout << name << " 의 소멸자 호출!" << endl;
if (name != NULL) {
delete[] name;
}
}
int main() {
// Marin marin1(2,3);
// Marin marin2(3,5);
//
// marin1.show_status();
// marin2.show_status();
//
// cout << "============== \n" <<
// "마린 1 이 마린 2 를 공격! \n" <<
// "============== \n" << endl;
// marin2.be_attacked(marin1.attack());
// marin1.show_status();
// marin2.show_status();
Marin* marins[100];
marins[0] = new Marin(2,3, "Henry");
marins[1] = new Marin(3,5, "Jane");
marins[0] -> show_status();
marins[1] -> show_status();
cout << "============== \n" <<
"마린 1 이 마린 2 를 공격! \n" <<
"============== \n" << endl;
marins[0] -> be_attacked(marins[1]->attack());
marins[0] -> show_status();
marins[1] -> show_status();
delete marins[0];
delete marins[1];
return 0;
}
위 코드에서 name만 포인터인 이유는 marin의 이름을 가변으로 설정하고 싶어서이다.
name = new char[strlen(marin_name) + 1] 과 같이 설정하면
문자열의 길이+1만큼 동적할당이 가능하고
name을 포인터로 함으로써 주소의 값을 가져오면 문자열을 받아 올 수 있다.
char name[30]과 같이 하지 않은 이유는
1. 31글자가 넘어가면 overflow
2. 3글자만 넣어도 30바이트 차지
-> 이런게 모여서 메모리누수가 생긴다
모던 cpp에서는 string 사용하면 된다!