상속을 받아 Base*를 이용하여 오브젝트를 생성할때 .....
안녕하세요 질문이 있어서 이렇게 글을 씁니다.
제가 현재 Base에 있는 Member Data를 Manager의 MyInsert 함수에서 객체를 생성하여 담아 BaseArray의 MyInsert에 넘기고 싶습니다. 현재 Base에는 전부 초기값이 주어져 있는 상태구요. 오브젝트를 생성할 때 값을 입력하지 않고 오브젝트에 멤버 데이터를 담는법이 궁금합니다.
현재 제가 작성한 소스로는
#pragma once #include <string> class Base { public: int m_itype; int m_ienergy; int m_imove; char* m_cname; int m_inum; public: Base(); Base(int itype, int ienergy, int imove, int inum, char* name); ~Base(void); Base(const Base& cp); Base operator=(const Base& cp); public: void move(); }; class Terran : public Base { public: int m_itype; public: Terran(); Terran(int itype); ~Terran(); }; class Zerg : public Base { public: int m_itype; public: Zerg(); Zerg(int itype); ~Zerg(); }; class Protoss : public Base { public: int m_itype; public: Protoss(); Protoss(int itype); ~Protoss(); }; class Marine : public Terran { public: int m_ienergy; int m_imove; int m_inum; char* m_cname; public: Marine(); Marine(int inum, int itype,int ienergy, int imove, char* cname); ~Marine(); }; class Tank : public Terran { public: int m_inum; int m_ienergy; int m_imove; char* m_cname; public: Tank(); Tank(int inum, int itype, int ienergy, int imove, char* cname); ~Tank(); }; class BattlCruiser : public Terran { public: int m_inum; int m_ienergy; int m_imove; char* m_cname; public: BattlCruiser(); BattlCruiser(int inum, int itype, int ienergy, int imove, char* cname); ~BattlCruiser(); }; class Zealot : public Protoss { public: int m_inum; int m_ienergy; int m_imove; char* m_cname; public: Zealot(); Zealot(int inum, int itype, int ienergy, int imove, char* cname); ~Zealot(); }; class Dragoon : public Protoss { public: int m_inum; int m_ienergy; int m_imove; char* m_cname; public: Dragoon(); Dragoon(int inum, int itype, int ienergy, int imove, char* cname); ~Dragoon(); }; class Carrier : public Protoss { public: int m_inum; int m_ienergy; int m_imove; char* m_cname; public: Carrier(); Carrier(int inum, int itype, int ienergy, int imove, char* cname); ~Carrier(); }; class Zergling : public Zerg { public: int m_inum; int m_ienergy; int m_imove; char* m_cname; public: Zergling(); Zergling(int inum, int itype, int ienergy, int imove, char* cname); ~Zergling(); }; class Hydra : public Zerg { public: int m_inum; int m_ienergy; int m_imove; char* m_cname; public: Hydra(); Hydra(int inum, int itype, int ienergy, int imove, char* cname); ~Hydra(); }; class Mutal : public Zerg { public: int m_inum; int m_ienergy; int m_imove; char* m_cname; public: Mutal(); Mutal(int inum, int itype, int ienergy, int imove, char* cname); ~Mutal(); };
Base.h에서 Base를 Terran,Protoss,Zerg가 상속을 받고 있고 Terran은 Marine,Tank,Battel이 상속 받고 있는 식으로 작성하였습니다.
Base.cpp에서는 각 Marine,Tank,Battle등의 초기값을 선언하였습니다.
#include "StdAfx.h" #include "Base.h" Base::Base() { } Base::Base(int inum,int itype, int iienergy, int imove, char* cname) { m_inum = inum; m_itype = itype; m_ienergy = iienergy; m_imove = imove; m_cname = new char[strlen(cname)+1]; strcpy(m_cname,cname); } Base::~Base() { delete m_cname; } void Base::move() { } Terran::Terran() { } Terran::Terran(int itype) { m_itype = itype; itype = 1; } Terran::~Terran() { } Protoss::Protoss() { } Protoss::Protoss(int itype) { m_itype = itype; itype = 2; } Protoss::~Protoss() { } Zerg::Zerg() { } Zerg::Zerg(int itype) { m_itype = itype; itype = 3; } Zerg::~Zerg() { } Marine::Marine() { } Marine::Marine(int inum,int itype, int ienergy, int imove, char* cname) { m_inum = inum; inum = 0; m_itype = itype; itype=4; m_ienergy = ienergy; ienergy = 500; int m_imove = imove; imove = 1; m_cname = new char[strlen(cname)+1]; strcpy(m_cname,cname), cname = "Marine"; } Marine::~Marine() { delete m_cname; } Tank::Tank() { } Tank::Tank(int inum, int itype, int ienergy, int imove, char* cname) { m_inum = inum; inum = 0; m_itype = itype; itype = 5; m_ienergy = ienergy; ienergy = 1000; int m_imove = imove; imove = 2; m_cname = new char[strlen(cname)+1]; strcpy(m_cname,cname); cname = "Tank"; } Tank::~Tank() { delete m_cname; } BattlCruiser::BattlCruiser() { } BattlCruiser::BattlCruiser(int inum, int itype,int ienergy, int imove, char* cname) { m_inum = inum; inum = 0; m_itype = itype; itype = 6; m_ienergy = ienergy; ienergy = 3000; int m_imove = imove; imove = 100; m_cname = new char[strlen(cname)+1]; strcpy(m_cname,cname); cname = "BattleCruiser"; } BattlCruiser::~BattlCruiser() { delete m_cname; } Zealot::Zealot() { } Zealot::Zealot(int inum, int itype, int ienergy, int imove, char* cname) { m_inum = inum; inum = 0; m_itype = itype; itype = 7; m_ienergy = ienergy; ienergy = 600; int m_imove = imove; imove = 1; m_cname = new char[strlen(cname)+1]; strcpy(m_cname,cname); cname = "Zealot"; } Zealot::~Zealot() { delete m_cname; } Dragoon::Dragoon() { } Dragoon::Dragoon(int inum, int itype, int ienergy, int imove, char* cname) { m_inum = inum; inum = 0; m_itype = itype; itype = 8; m_ienergy = ienergy; ienergy = 700; int m_imove = imove; imove = 2; m_cname = new char[strlen(cname)+1]; strcpy(m_cname,cname); cname = "Dragoon"; } Dragoon::~Dragoon() { delete m_cname; } Carrier::Carrier() { } Carrier::Carrier(int inum, int itype, int ienergy, int imove, char* cname) { m_inum = inum; inum = 0; m_itype = itype; itype = 9; m_ienergy = ienergy; ienergy = 800; int m_imove = imove; imove = 3; m_cname = new char[strlen(cname)+1]; strcpy(m_cname,cname); cname = "Carrier"; } Carrier::~Carrier() { delete m_cname; } Zergling::Zergling() { } Zergling::Zergling(int inum, int itype, int ienergy, int imove, char* cname) { m_inum = inum; inum = 0; m_itype = itype; itype = 10; m_ienergy = ienergy; ienergy = 110; int m_imove = imove; imove = 2; m_cname = new char[strlen(cname)+1]; strcpy(m_cname,cname); cname = "Zergling"; } Zergling::~Zergling() { delete m_cname; } Hydra::Hydra() { } Hydra::Hydra(int inum, int itype, int ienergy, int imove, char* cname) { m_inum = inum; inum = 0; m_itype = itype; itype = 11; m_ienergy = ienergy; ienergy = 400; int m_imove = imove; imove = 2; m_cname = new char[strlen(cname)+1]; strcpy(m_cname,cname); cname = "Hydra"; } Hydra::~Hydra() { delete m_cname; } Mutal::Mutal() { } Mutal::Mutal(int inum, int itype, int ienergy, int imove, char* cname) { m_inum = inum; inum = 0; m_itype = itype; itype = 12; m_ienergy = ienergy; ienergy = 800; int m_imove = imove; imove = 2; m_cname = new char[strlen(cname)+1]; strcpy(m_cname,cname); cname = "Mutal"; } Mutal::~Mutal() { delete m_cname; }
보시는 것처럼 값을 따로 입력 할 필요가 없이 초기값을 따로 선언하였습니다.
근데 문제는 여기부터 발생합니다.
Manager의 MyInsert함수에서 Object를 생성하여 거기다가 해당 값을 담고
itype을 MultiMap의 Key로 잡은 상태에서 Second부분에 Object(모든 변수가 담김)를 넣고 싶습니다.
void Manager::MyInsert() { int inum; int itype; int ienergy; int imove; char cname[20]; printf("생산할 유닛 입력"); cin>>cname; printf("생산할 수량 입력"); cin>>inum; Base* Object = new Base(inum,itype,ienergy,imove,cname); m_BaseArray->MyInsert(Object); }
현재 제가 작성한 MyInsert 함수입니다. 여기서 생산할 유닛 입력 부분 말고 생산할 수량 입력 부분에서
생산할 수량과 name이 일치하면 해당 유닛을 증가 시키고 싶은 구조입니다.
이것을 Array에서는 전달인자로 Object를 받아 m_itype을 key로 잡고 Object를 Second로 넣고 있습니다.
void BaseArray::MyInsert(Base* Object) { Object->m_itype; m_arryBase.insert(make_pair(Object->m_itype,Object)); }
현재 이런 상황인데 Object에 값이 제대로 들어가지 않을 뿐만 아니라 어떻게 해결을 해야 할지 모르겠습니다..
도와주세요!!
(몇 가지만)
1. BaseArray가 어떻게 생겼는지 안 나와서 모르겠지만 insert를 쓰는 방식을 봐서는 전혀 어레이가 아닌 것 같은데요. 실제로 동작하는 기능과 일치하지 않는 이름을 쓰면 보는 남들도 헷갈리고 곧 자기 자신도 헷갈리게 되어 전혀 좋지 않습니다. 이름을 바꾸는 것을 추천합니다.
2. Base에 m_itype을 선언했으면 derived class에 m_itype을 선언할 필요가 없습니다. 선언하면 같은 이름의 *또다른* 멤버 변수가 생기게 됩니다. (즉 Terran에서 m_itype을 바꿔봤자 Base *로 받아서 m_itype을 보면 다른 변수기 때문에 그 값이 안보인다는...)
3. "제대로 들어가지 않을 뿐만 아니라"라고만 쓰면 도움을 받기 힘듭니다. 정확히 무슨 값이 나와야 하는데 돌려보니 무슨 값이 나온다고 적어주시면 원하는 답을 얻을 확률이 높습니다.
댓글 달기