본문 바로가기
C++/학교 숙제

session_6_ex 답

by Beijing_KingGod 2018. 4. 22.

#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

댓글