열렬히.뛰기

Cpp module 03

école 42 > Cpp part.1 > 42 : Cpp 모듈 > Cpp module 03

ex00

ClapTrap이라는 클래스를 만들고, 실제로 돌아가는 것을 보여줄 것.

cpp
// ClapTrap 클래스 내부에 구현할 것.
private:
	String name;
	unsigned int hitpoints;    // hp
	unsigned int EnergyPoints; // ep
	unsigned int AttackDamage; // attack

public:
	(orthodox canonical form) // 기본생성, 복사생성, '=' 오버로딩, 소멸 
	ClapTrap(String name);    // 이름이 있을 때의 생성자
	void attack();            // 상대방을 공격
	void takeDamage(amount);  // 내가 데미지를 받음
	void beRepaired(amount);  // hitpoints를 회복
	unsigned int getDamage(); // 얼마나 데미지를 줄지를 판단

생성자의 조건

  • name = (없으면 default)
  • hitpoints(10), EnergyPoints(10), AttackDamage(0)
  • 작동되었는지 표기할 것. (생성자 & 소멸자 둘 다)

멤버함수의 구현

cpp
attack() -> attackDamage만큼을 공격
takeDamage(amount) -> hitpoints를 amount만큼 깎음
beRepaired(amount) -> hitpoints를 amount만큼 돌려받음

main()의 구현 모양

cpp
ClapTrap A, B 만들기

A -> B 공격. B 데미지 입음 ( attack() & takeDamage(getDamage()) )
B 회복 ( beRepaired() )
B -> A 공격. A 데미지 입음 ( attack() & takeDamage(getDamage()) )
A 회복 ( beRepaired() )

ex01

ClapTrap을 상속, 새 클래스 ScavTrap을 만들 것. ScavTrap은 생성자, 소멸자, attack()에서 ClapTrap과 다른 메세지를 표기 이후 실제로 ScavTrap이 작동하는 모습을 보여줄 것.

cpp
ClapTrap:
	protected : 기존 private에 있던 멤버 4개 (하위 클래스에서도 공유)
	public : 기존 OCF + 기존 멤버변수

ScavTrap extends ClapTrap:
	public :
		(orthodox canonical form)
		ScavTrap(std::string name);
		void guardGate(); // guardGate 모드
		attack() // 오버라이딩 필요

생성자의 조건

ClapTrap : hitpoints(10), EnergyPoints(10), AttackDamage(0), 메세지

ScavTrap : hitpoints(100), EnergyPoints(50), AttackDamage(20), 메세지

main()의 구현 모양

cpp
ClapTrap A();
ScavTrap B();

// A -> B 공격. B 데미지 입음
// B 회복
// B -> A 공격. A 데미지 입음
// A 회복

ex02

ClapTrap을 상속, 새 클래스 FragTrap을 만들 것. FragTrap은 생성자, 소멸자에서 ClapTrap과 다른 메세지를 표기

cpp
ClapTrap:
	protected : 기존 private에 있던 멤버 4개 (하위 클래스에서도 공유)
	public : 기존 OCF + 기존 멤버변수

FragTrap extends ClapTrap:
	public :
		(orthodox canonical form)
		ScavTrap(std::string name);
		void highFivesGuys(void);

생성자의 조건

ClapTrap : hitpoints(10), EnergyPoints(10), AttackDamage(0), 메세지

FragTrap : hitpoints(100), EnergyPoints(100), AttackDamage(30), 메세지

main()의 구현 모양

cpp
ClapTrap A("a");
FragTrap B("b");

// A -> B 공격
// B 회복
// B -> A 공격
// A 회복
// B의 highFivesGuys()

ex03

ClapTrap (조부모) → Frag / Scav (부모) → DiamondTrap (손자) DiamondTrap은 한번만 만들어져야 함. ⇒ 가상 상속 필요 ClapTrap의 name = DiamondTrap의 name + “_clap_name”

DiamondTrap을 구현해서 예시도 보여주기.

cpp
ClapTrap:
	protected : 기존 private에 있던 멤버 4개 (하위 클래스에서도 공유)
	public : 기존 OCF + 기존 멤버변수

FragTrap : virtual public ClapTrap
	public : 기존 OCF + 기존 멤버변수

ScavTrap : virtual public ClapTrap
	public : 기존 OCF + 기존 멤버변수	

DiamondTrap:
	private:
		std::String name;
	public:
		(orthodox canonical form)
		void whoAmI();

----------------------------------------------
DiamondTrap이 상속받아야 하는 것.
 - 1. FragTrap : Hitpoints, AttackDamage
 - 2. ScavTrap : EnergyPoints, attack()

* 변수 = 생성자 초기화할 때 대입. 단, 이때 부모 클래스도 미리 다 초기화
* 함수 = attack()을 오버로딩한 다음 부모 클래스의 해당 함수 불러옴.

hitpoints = 100 = Fragtrap의 hitpoints
EnergyPoints = 50 = ScavTrap의 EnergyPoints
AttackDamage = 30 = Fragtrap의 AttackDamage

main()의 구현 모양

cpp
ClapTrap A("a");
ScavTrap A2("a2");
DiamondTrap B("b");

// 상속 변수값 체크
// whoamI(), highFive(), guardGate() 체크
// A2 -> B 공격 : - 
// B -> A2 공격 :  - 30

gcc -Wshadow 옵션

javascript
-Wshadow 옵션 : 지역변수가 다른 지역변수, 매개변수 등(shadow) 덮는 경우 Warning이 발생합니다.