컨트롤 전송으로 다음 초기화를 건너뜀 이라는 오류가 남
switch (Inp) {
case 1:
cout << "원하시는 닉네임을 입력하세요. ";
string tmpName;
cin >> tmpName;
player->setNickname(tmpName);
break;
switch문의 구조상 다른 case로 점프하는 경로가 tmpName초기화를 건너뛸 수 있다고 판단해서 컴파일러가 막은것(string처럼 생성/소멸이 필요한 타입은 더 엄격)
해결방법
case 1에 중괄호로 감싸서 tmpName의 생존범위를 중괄호로 제한시켜서 해결했다.
switch (Inp) {
case 1: {
cout << "원하시는 닉네임을 입력하세요. ";
string tmpName;
cin >> tmpName;
player->setNickname(tmpName);
break;
}
class Monster{
public:
...
void attack(Player* player);
...
}
// monster.h
class Monster;
class Player{
public:
...
virtual void attack(Monster* monster) = 0;
...
}
// Player.h
// Copyright 2025 JongKyu.
#include "Player.h"
#include "Warrior.h"
#include "Monster.h"
#include <string>
#include <iostream>
using namespace std; // NOLINT
Warrior::Warrior(string nickname) : Player(nickname) {}
void Warrior::attack() {};
void Warrior::attack(Monster* monster) {
int damage = getPower() - monster->getDefence();
if (damage <= 0) {
damage = 1;
}
std::cout << " * " << monster-> getName() << "에게 검으로 "
<< damage << "의 피해를 입혔다!\n";
int TmpHP = monster->getHP() - damage;
monster->setHP(TmpHP);
int MonsterHP = monster->getHP();
if (MonsterHP > 0) {
std::cout << "몬스터 생존! 남은 HP : " << MonsterHP << "\n";
} else {
std::cout << "몬스터 처치 플레이어 승리!!\n";
}
}
...
#include <random>
static std::random_device rd;
static std::mt19937 gen(rd());
static std::uniform_int_distribution<> dis_monster(0, 4);
Monster* CreateRandomMonster() {
string monsterNames[] = {"슬라임", "고블린", "발록", "오크", "드래곤"};
int index = dis_monster(gen);
Monster* monster = new Monster(monsterNames[index]);
return monster;
}
...
Monster* monster = CreateRandomMonster(); // 함수 호출
random라이브러리를 통해 랜덤값을 만들었다.if (player != nullptr)
delete player;
if (monster != nullptr)
delete monster;
new로 동적할당한 메모리를 프로그램 종료 전에 delete로 메모리 해제하여 메모리 누수 방지virtual void makeSound() = 0;