ex00
ClapTrap이라는 클래스를 만들고, 실제로 돌아가는 것을 보여줄 것.
// 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)- 작동되었는지 표기할 것. (생성자 & 소멸자 둘 다)
멤버함수의 구현
attack() -> attackDamage만큼을 공격
takeDamage(amount) -> hitpoints를 amount만큼 깎음
beRepaired(amount) -> hitpoints를 amount만큼 돌려받음
main()의 구현 모양
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이 작동하는 모습을 보여줄 것.
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()의 구현 모양
ClapTrap A();
ScavTrap B();
// A -> B 공격. B 데미지 입음
// B 회복
// B -> A 공격. A 데미지 입음
// A 회복
ex02
ClapTrap을 상속, 새 클래스 FragTrap을 만들 것. FragTrap은 생성자, 소멸자에서 ClapTrap과 다른 메세지를 표기
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()의 구현 모양
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을 구현해서 예시도 보여주기.
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()의 구현 모양
ClapTrap A("a");
ScavTrap A2("a2");
DiamondTrap B("b");
// 상속 변수값 체크
// whoamI(), highFive(), guardGate() 체크
// A2 -> B 공격 : -
// B -> A2 공격 : - 30
gcc -Wshadow 옵션
-Wshadow 옵션 : 지역변수가 다른 지역변수, 매개변수 등(shadow) 덮는 경우 Warning이 발생합니다.