[42Seoul] CPP Module 01 - ex03

수빈·2022년 1월 11일
0

42CPP

목록 보기
8/11
post-thumbnail
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을 보고 필요함 함수를 파악해야 한다.

  • club 객체의 setType 함수를 사용해도 Human 객체가 지니고 있는 Weapon의 type이 변경되므로, Human 클래스 내의 Weapon은 생성자는 setWeapon 함수를 통해 들어온 Weapon 객체가 저장된 메모리를 참조할 수 있어야 한다.
  • Human 클래스 내의 Weapon은 포인터나 참조자로 선언한다.
  • 과제 규칙 중 HumanB는 Weapon이 NULL일 수도 있다는 의미이로 HumanB는 포인터로 선언.
  • club은 포인터 변수가 아니며, HumanA 생성자의 두번째 매개변수로 객체 자체를 받기 때문에 HumanA는 참조자로 선언한다.

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)
{
}
profile
42Seoul -soooh ~ 2022.04

0개의 댓글