std::srand(static_cast<unsigned>(std::time(nullptr))); // 시드 설정
int randomValue = std::rand() % 100 + 1; // 1~100 사이의 랜덤 값 생성
std::unique_ptr은 소유권을 가진 포인터로, 해당 객체는 std::unique_ptr이 파괴될 때 자동으로 해제된다.delete를 호출하지 않아도 메모리 누수를 방지할 수 있다.std::unique_ptr<Monster> monster = std::make_unique<Slime>();
std::rand()를 사용해 몬스터를 랜덤으로 생성하는 방법을 배웠다.switch문을 통해 랜덤하게 생성하고, 이를 std::vector에 저장하여 전투에 사용할 수 있다.std::vector<std::unique_ptr<Monster>> monsters;
for (int i = 0; i < 3; ++i) {
monsters.push_back(createNormalMonster());
}
std::vector를 사용하여 동적으로 생성된 몬스터를 관리하고, 전투에서 사용할 수 있게 하는 방법을 배웠다.std::vector<std::unique_ptr<Monster>> monsters;
monsters.push_back(createNormalMonster());
typeid와 name() 메서드를 이용하여 객체의 타입을 동적으로 확인하는 방법을 배웠다.typeid는 객체의 타입을 반환하는데, 이를 사용해 객체가 어떤 클래스의 인스턴스인지 출력할 수 있다.std::cout << "A wild " << typeid(*monster).name() << " appeared!" << std::endl;
typeid(*monster).name()에서name()메서드는 C++의 RTTI (Run-Time Type Information) 기능을 통해 제공되는 메서드이다.typeid연산자는 객체의 타입 정보를 얻을 수 있게 해주며,name()메서드는 그 타입에 대한 문자열을 반환한다.
RTTI와typeid
typeid는 주어진 객체의 타입에 대한 정보를 반환하는 연산자이다. 보통 다형성(polymorphism)을 사용할 때, 즉 상속 관계에서 사용된다.typeid는 클래스의 객체에 대해 실제 타입을 확인할 수 있도록 돕는다.
name()은type_info객체의 멤버 함수로, 객체의 타입 이름을 반환합니다. 하지만 이 반환된 이름은 컴파일러에 따라 다를 수 있으며, 항상 사람이 읽기 쉽게 출력되는 것은 아닙니다. 예를 들어, 컴파일러에 따라 "class A" 또는 "_Z3Fooi"처럼 나올 수 있다.
예시
#include <iostream>
#include <typeinfo> // typeid와 type_info를 사용하기 위해 필요
class Monster {
public:
virtual ~Monster() {}
};
class Slime : public Monster {};
class Orc : public Monster {};
int main() {
Slime slime;
Monster* monster = &slime;
std::cout << "A wild " << typeid(*monster).name() << " appeared!" << std::endl;
return 0;
}
여기서 typeid(*monster).name()은 Slime 클래스에 대한 이름을 반환한다. 하지만 이 이름은 컴파일러의 구현에 따라 달라질 수 있다.
주의 사항
name()은 C++ 표준 라이브러리의 type_info 클래스의 메서드이다.typeid를 사용하여 객체의 타입 정보를 가져오고, name()을 통해 그 타입의 이름을 문자열로 확인할 수 있다.