TIL: C++ 기초(2) 2025.11.11

박춘팔·2025년 11월 11일
0

CPP TIL

목록 보기
2/2
post-thumbnail
#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 사용하면 된다!

profile
이것 저것 다해보는 삶

0개의 댓글