CPP Module 03

hhkim·2022년 5월 22일
0

42cursus

목록 보기
12/20
post-thumbnail

ex00 - Aaaaand... OPEN!

구현

ClapTrap 클래스

private 멤버

  • name: 생성자로 전달되는 값
  • hit points(10): ClapTrap의 건강
  • energy points(10)
  • attack damage(0)

public 멤버

hit pointsenergy points가 없으면 아무것도 할 수 없음

  • void attack(const std::string& target);: 타겟은 attack damage만큼 hit points를 잃음 (1 energy points 소모)
  • void takeDamage(unsigned int amount);: 데미지 입은 타겟이 호출 (amount만큼 hit points 잃음)
  • void beRepaired(unsigned int amount);: amount만큼 자신의 hit points 회복 (1 energy points 소모)

메시지 출력

  • 각 멤버 함수는 무슨 일이 일어나는지에 관한 메시지를 출력해야 함
    예) ClapTrap <name> attacks <target>, causing <damage> points of damage!
  • 생성자와 소멸자도 메시지를 출력해야 함
  • 테스트 코드 작성

attack damage가 0?

데미지가 0인데 공격해봤자 무슨 소용이지 싶었는데 Clap Trap이라는 것 자체가 보더랜드라는 게임 캐릭터고, 무능하다고 함..ㅎ


ex01 - Serena, my love!

개념

상속

기존에 정의된 클래스의 모든 멤버 변수와 멤버 함수를 물려받아 새로운 클래스를 작성하는 것

class 클래스_이름 : 접근제한자 부모_클래스명{
	//.. 내용 ..//
}
  • 기초 클래스(base class): 기존에 정의된 클래스 (부모 클래스, 상위 클래스)
  • 파생 클래스(derived class): 상속을 통해 새롭게 작성되는 클래스 (자식 클래스, 하위 클래스)
  • 기존에 작성된 클래스를 재활용하여 재사용성 up

자식 클래스의 생성자

  • 생성자 초기화 리스트에서 부모의 생성자를 호출해서 멤버 변수들을 초기화할 수 있음
  • 부모의 멤버 변수를 자식의 초기화 리스트에서 직접 변경할 수는 없음

접근 제한자

  • private: 자신의 클래스 안에서만 접근 가능
  • protected: 자신을 상속하는 클래스까지만 접근 가능
  • public: 어디서나 접근 가능
  • 상속받을 때 접근 제한자를 지정하지 않으면 기본은 private
  • 접근 제한자가 private이나 protected면 범위가 더 넓은 멤버의 접근 제한자가 좁혀짐
    👉 부모의 접근 제한자를 그대로 받으려면 public으로 지정!

오버라이딩

부모 클래스에서 정의된 함수를 자식 클래스에서 재정의하는 문법

  • 기존 함수와 동일한 원형을 가짐

구현

ScavTrap 클래스

  • 테스트 코드에서 생성/소멸 체이닝이 적절히 나타나야 함
  • 생성은 ClapTrap=>ScavTrap 순서, 소멸은 반대
    👉 파생 클래스의 객체 생성
    => 기초 클래스의 생성자 호출
    => 파생 클래스의 생성자 호출
    => 파생 클래스의 소멸자 호출
    => 기초 클래스의 소멸자 호출

멤버 변수

  • ClapTrap의 값 사용
    • name: 생성자의 인자로 전달되는 값
    • hit points(100)
    • energy points(50)
    • attack damage(20)

👉 자식 클래스에서 부모의 private 멤버를 사용할 수 없기 때문에 protected로 접근 제한자 변경 필요

멤버 함수

  • void guardGate();: Gate keeper mode라는 메시지 출력
  • 생성자, 소멸자, attack()은 다른 메시지 출력
    👉 오버라이딩!

ex02 - Repetitive work

구현

FragTrap 클래스

  • ClapTrap을 상속받음
  • 생성자와 소멸자의 메시지가 달라야 함

멤버 변수

  • ClapTrap의 값 사용
    • name: 생성자의 인자로 전달되는 값
    • hit points(100)
    • energy points(100)
    • attack damage(30)

멤버 함수

  • void highFivesGuys(void);: 긍정적인 하이파이브를 요청하는 메시지 출력

ex03 - Now it’s weird!

개념

다중 상속

2개 이상의 클래스로부터 상속을 받는 것

  • 부모 클래스의 멤버 이름이 동일한 경우 부모 이름을 앞에 명시해주어 명확히 해줘야 함
    예) child.FirstParent::getName();
  • 상속받을 부모 클래스가 같은 부모를 상속받아서 구현된 경우 (다이아몬드 상속), 동일 멤버를 이중 상속받지 않도록 가상 상속을 사용해야 함
    👉 이후로 손자 클래스에서 할머니 클래스의 생성자를 꼭 직접 호출해야 함 (아니면 기본 생성자 호출)

구현

DiamondTrap 클래스

  • FragTrapScavTrap을 상속
  • DiamondTrap에 대한 ClapTrap은 한 번만 생성되어야 함 (다이아몬드 상속 문제 해결)

멤버 변수

  • ClapTrap::name: 생성자의 인자로 전달되는 값 + _clap_name
  • name: 생성자의 인자로 전달되는 값
    • private에 ClapTrap의 변수명과 똑같이 작성
  • hit points(FragTrap)
  • energy points(ScavTrap)
  • attack damage(FragTrap)

멤버 함수

  • attack(): (ScavTrap)
  • void whoAmI();: 자기 이름과 ClapTrap 이름을 모두 출력

👉 같은 멤버가 있으면 마지막에 상속받은 클래스의 것으로 덮어씌워지므로 덮어씌워진 값은 수동으로 수정해야 함

0개의 댓글