메모리 동적할당, 다형성, 가상 클래스, 인터페이스
ex00
다형성 구현하기
cpp
Animal -> Dog, Cat
각 객체 -> 해당 객체에 맞는 울음소리 메소드 생성
Animal -> cat
WrongAnimal -> WrongCat
* 둘의 차이? 가상함수(virtual)을 썼는지의 구분
ex01
cpp
// 1. 배열 만들기
Animal *animal[10]; // "객체를 가리키는 포인터" 들의 배열
for (size_t i = 0; i < 10; i++)
{
if (i % 2 == 0)
animal[i] = new Dog();
else
animal[i] = new Cat();
}
std::cout << std::endl << std::endl;
for (size_t i = 0; i < 10; i++)
delete animal[i];
2. 깊은 복사 확인하기
- 객체 2개 만들기.
- 대입연산자 써서 before / after 확인하기
ex02
cpp
/*
인스턴스화가 불가능한 클래스를 만드는 것
= 클래스에 순수 가상함수를 포함하라는 것.
*/
// 순수 가상함수 만들기
class father {
public :
virtual void converse() = 0; // 순수 가상함수
}
class son : public father
{
void converse() {...}
}
ex03
concrete class : 구상 클래스
- 추상 클래스 (abstract class)의 반대말.
- 모든 메소드의 구현부가 완성된 클래스
게임 디자인이라고 생각하고 설계 Materia, Ice, Cure 계열 : 물질 Character 계열 : 등장인물 MateriaSource 계열 : 물질 제조
즉, Character가 Materia를 쓰기 위해 MateriaSource를 이용.
cpp
1. AMateria 클래스 디자인
* OCF 구현하기
* gettype(), settype()
* use(ICharacter &target) 만들기
- type이 ice면 : "* shoots an ice bolt at <name> *"
- type이 heal이면 : "* heals <name>’s wounds *"
2. Ice, Cure 구현
* AMateria::clone() 메소드를 재작성하기
* clone()은 메소드는 동적할당된 객체를 반환한다.
- 반환 타입이 AMateria * 이므로...
- new Ice() 또는 new Cure()을 반환하면 된다.
- AMateria *a = clone() => 이런 식으로 사용
3. ICharacter
- 건드리지 말 것.
4. Character
- private, 멤버변수 : Materia 배열 & 이름
- 이름 : 캐릭터의 이름.
- inventory : Ice나 heal이 들어가는 Materia 배열
- 배열 자체는 정적. 안에 들어가는 내용물은 동적.
-
- public, 멤버함수
- OCF 구현 (반드시 깊은 복사)
- 복사시 각 Materia는 지워지고, 새것을 채워넣어야 함.
- Character(std::string name) 구현
- equip()
- unequip()
- use(int idx, ICharacter &target)
- inventory[idx]의 use(target)을 쓰도록 설계
main() 구현하기
cpp
int main()
{
// 기술 저장고에 기술 저장
IMateriaSource *src = new MateriaSource();
src->learnMateria(new Ice());
src->learnMateria(new Cure());
// 캐릭터 생성
Character *npc1 = new Character("npc1");
Character *npc2 = new Character("npc2");
// materia 생성
AMateria *item1 = src->createMateria("Ice");
if (item1)
npc1->equip(item1);
AMateria *item2 = src->createMateria("Cure");
if (item2)
npc2->equip(item2);
// 기술 사용
std::cout << "npc1 기술사용" << std::endl;
npc1->use(0, *npc2);
std::cout << "npc2 기술사용" << std::endl;
npc2->use(0, *npc2);
// unequip
npc1->unequip(0);
npc2->unequip(0);
npc1->equip(item1);
// 캐릭터 해제
delete npc1;
delete npc2;
// 저장창고 해제
delete src;
return 0;
}