Interface & recap
- Interface는 C++98 (심지어 C++20에서도) 에서는 존재 하지 않습니다.
- 그러나 순수 추상함수는 보통 Interface라고 불립니다.
- 그러므로, 이 마지막 과제에서는 이 모듈을 완벽하게 이해하기 위해 interface를 구현해봅시다
- 아래의
AMateria
클래스 정의를 완성하고 필요한 멤버 함수를 구현하세요.
class AMateria
{
protected:
[...]
public:
AMateria(std::string const & type);
[...]
//Returns the materia type
std::string const & getType() const;
virtual AMateria* clone() const = 0;
virtual void use(ICharacter& target);
};
- Materias concrete class인
Ice
와 Cure
를 구현하세요.
- 추상 클래스가 아닌 클래스들을 concrete class 라고 부름…
- 그들의 타입을 정하기 위한 이름은 소문자로 쓰세요
- 당연히 그들의 멤버함수
clone()
은 같은 타입의 새로운 인스턴스를 반환합니다.
- Ice Materia를 clone하면 new Ice Materia를 반환해야 합니다.
use(ICharacter&)
멤버 함수는 아래 내용을 수행해야 합니다.
- Ice : “* shoots can ice bolt at <name> *”
- Cure : “* heals <name>’s wounds *”
- <name> 은 매개변수로 전달된 Chracter의 name입니다. <>는 출력하지 마세요
- Materia를 할당 할 때, type이 맞지 않아도 복사하세요.
- concreate class
Character
는 아래의 인터페이스를 따라야 합니다.
class ICharacter
{
public:
virtual ~ICharacter() {}
virtual std::string const & getName() const = 0;
virtual void equip(AMateria* m) = 0;
virtual void unequip(int idx) = 0;
virtual void use(int idx, ICharacter& target) = 0;
};
Character
는 4개의 슬롯이 있는 인벤토리를 갖고 있고, 최대 4개의 Materias를 가질 수 있습니다.
- 생성할 때에 인벤토리는 비어 있습니다.
- 처음으로 찾은 Materias는 첫 번째 빈 슬롯에 장비합니다.
- 즉, 슬롯 0부터 슬롯 3까지 차례로 장비합니다.