#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Weapon{ // 추상 클래스 : 객체화 하지 못한다.
// weapon 이 추상클래스 라서 객체화를 하지 못하기 때문에 객체 포인터로 접근을 해야한다.
public:
virtual int countAmmunition()=0; //순수 가상함수
virtual void fire()=0;
virtual string model()=0;
};
class Gun : public Weapon{ // 순수 가상함수를 모두 오버로딩 해주어야한다.
// 자식 객체이기 때문
protected:
int ammunition;
string name;
public:
Gun(string name, int ammo){
this->name=name;
this->ammunition= ammo;
cout<<"this is gun"<<endl;
}
int countAmmunition(){
return ammunition;
}
void fire(){
if(ammunition==0){
cout<<endl;
}
else{
cout<<"BANG with "<<"my <"<<name<<">"<<endl;
ammunition--;
}
}
string model(){
return name;
}
};
class ShotGun:public Gun{
public:
ShotGun():Gun("shot_gun",5){
cout<<"this is shotgun"<<endl;
}
};
class Riffle : public Gun {
public:
Riffle():Gun("riffle", 10){
cout<<"this is riffle"<<endl;
}
};
class Soldier{
private:
Weapon* left;
Weapon* right;
string name;
string rank;
public:
Soldier(string name, string rank){
this->name=name;
this->rank=rank;
left=NULL; // 포인터는 초기화 하지 않으면 NULL 값이 아니라 쓰레기 값이 들어가기 때문에 초기화를 시켜주어야한다.
right=NULL;
}
void scream(){
cout<<"AAAAHHH"<<endl;
}
virtual void identification(){
cout<<"<"<<rank<<"> <"<<name<<"> Sir"<<endl;
}
virtual void fireLeft(){
if(left!=NULL){
left->fire();
}
}
virtual void fireRight(){
if(right!=NULL){
right->fire();
}
}
virtual void setRight(Weapon* r){
right = r;
}
virtual void setLeft(Weapon * l){
left = l;
}
};
class Infantry:public Soldier{
public:
Infantry(string name):Soldier(name,"sergeant"){
}
};
class Sniper:public Soldier{
public:
Sniper(string name):Soldier(name,"sniper"){
}
};
class CaptainAmerica:public Soldier{
public:
CaptainAmerica():Soldier("CaptainAmerica","CaptainAmerica"){
}
void identification(){
cout<<"I am Captain America but I wish I was Batman."<<endl;
}
void setLeft(Weapon *){
cout<<"I don't need it, I have my vibranium shield."<<endl;
}
void setRight(Weapon *){
cout<<"I don't need it, I have my vibranium shield."<<endl;
}
void fireLeft(){
cout<<"PLEASE HELP ME SpiderMan!!!"<<endl;
}
void fireRight(){
cout<<"PLEASE HELP ME SpiderMan!!!"<<endl;
}
//even he has weapons attached to his hands or not
};
class Vehicle{
private:
std::vector<Soldier *> v;
public:
int countSoldier(){
vector <Soldier *> ::size_type i; // 벡터 방수
i=v.size();
return i;
}
virtual void action()=0;
void addSoldier(Soldier * i){
v.push_back(i); // vector 객체에 i객체 늠
}
std::vector<Soldier *> unload(){
v.clear(); // 벡터 클리어
return v;
}
};
class BlackBird:public Vehicle{
public:
BlackBird(){}
void action(){
cout<<"Oh my way guys! OVER"<<endl;
}
};
class Jeep : public Vehicle{
public:
Jeep(){}
void action(){
cout<<"Fast and Furious sucks"<<endl;
}
};
int main(void){
Soldier kum ("kum","high"); // 객체화
kum.fireLeft();
kum.fireRight();
kum.identification();
kum.scream();
kum.setLeft(new ShotGun());
kum.setRight(new Riffle());
kum.fireLeft();
kum.fireRight();
Soldier* kim=new Soldier("kim","low"); // 객체 포인터로 객체화
kim->identification();
kim->setLeft(new Gun("this is gun",2000));
kim->fireLeft();
Infantry* infan = new Infantry("park");
infan->identification();
infan->scream();
infan->setLeft(new Riffle());
infan->fireLeft();
CaptainAmerica* cap = new CaptainAmerica();
cap->identification();
cap->fireLeft();
cap->fireRight();
cap->scream();
cap->setLeft(new Riffle);
cap->fireLeft();
BlackBird* bb = new BlackBird();
bb->action();
bb->addSoldier(new CaptainAmerica());
cout<<bb->countSoldier()<<endl;
bb->addSoldier(kim);
bb->addSoldier(infan);
bb->addSoldier(new Sniper("oh"));
cout<<bb->countSoldier()<<endl;
cout<<bb->unload().size()<<endl;
return 0;
}
'C++ > 학교 숙제' 카테고리의 다른 글
session_4_ex infint.cpp(완성) (0) | 2018.04.22 |
---|---|
session_4_ex infint.hpp (완성) (0) | 2018.04.22 |
session_6_ex (0) | 2018.04.22 |
string 문자열 뺄셈계산 (0) | 2018.04.15 |
string 문자열 덧셈계산 (0) | 2018.04.14 |
댓글