int main()
{
{
Weapon club = Weapon("crude spiked club");
HumanA bob("Bob", club);
bob.attack();
club.setType("some other type of club");
bob.attack();
}
{
Weapon club = Weapon("crude spiked club");
HumanB jim("Jim");
jim.setWeapon(club);
jim.attack();
club.setType("some other type of club");
jim.attack();
}
}
해당 과제에서는 main문이 주어진다. == main을 보고 필요함 함수를 파악해야 한다.
HumanA, HumanB에서 사용하는 Weapon을 꺼내지 않고 setType을 통해 A, B에 저장된 Weapon 값이 변경되어야 한다.
setWeapon()나 HumanA 생성자에서는 포인터를 사용하지 않았으니 참조를 사용하고, HumanB는 weapon 타입 클래스 변수가 NULL이어야 하며, setWeapon을 통해 클래스를 세팅하기 때문에 포인터를 사용하였다.
HumanA에서 참조 변수를 초기화할 필요가 있을 경우 초기화 리스트를 사용한다.
HumanA::HumanA(std::string name, Weapon &weapon)
{
this->name = name;
this->weapon = weapon;
}
해당 내용으로 컴파일을 하면 오류가 난다.
선언과 동시에 초기화해야 한다는 참조자의 제약 사항이 있기 때문. 또한 참조 변수가 아니어도 Class가 const로 선언되었다면 같은 오류가 발생할 것이다. 기존에 사용하는 방식은 선언 후 대입하는 방식에 가깝기 때문에 밑의 내용과 같이 수정했다.
HumanA::HumanA(std::string name, Weapon &weapon) : name(name), weapon(weapon)
{
}