열렬히.뛰기

Cpp module 04

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

메모리 동적할당, 다형성, 가상 클래스, 인터페이스

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;
}