#include < Iostream.h>
#include < Fstream.h>
#include < String.h>
#include < Conio.h>
class animal
{
protected:
char * m _ pname;
public:
animal ()
{
m _ pname = ;
}
animal (char * p)
{
m _ pname = newchar [strlen (p)+1];
strcpy(m_pName, p) :
}
virtual ~ animal ()
{
if (m _ pname)
delete m _ pname;
}
constchar * getname () {return m _ pname; }
virtual char animalType()=; //순수 가상 함수-인터페이스, 하위 클래스는
virtual void WhoAmI()=; //순수 가상 함수-인터페이스, 하위 클래스는
};
classcat: public animal
{
public:
cat (): animal () {}
cat ( < 동물 유형: 고양이 이름: "< < M_pName;
}
virtualchar animaltype ()
{
return' c';
}
};
classdog: public animal
{
public:
dog (): animal () {}
dog ( < 동물 유형: 개 이름: "< < M_pName;
}
virtualchar animaltype ()
{
return' d';
}
virtual ~Dog(){}
};
classmonkey: public animal
{
public:
monkey (): animal () {}
; < 동물 유형: 원숭이 이름: "< < M_pName;
}
virtualchar animaltype ()
{
return' m';
}
};
classzoo
{
private:
unsigned int m _ max animals;
unsigned int m_NumAnimals;
Animal* *m_pResidents;
char m _ SZ 파일 이름 [256];
public:
zoo (unsigned int max)
{
m _ maxanimals = max;
m_NumAnimals = ;
m _ presidents = new animal * [m _ max animals];
memset (m _ presidents, , sizeof (animal *) * m _ max animals);
m_szfileName[] =;
};
void freeallanimals ()
{
for (unsigned int I = ; I< M_MaxAnimals; +I)
{
if (m _ presidents)
{
delete m _ presidents;
m_pResidents = ;
}
}
m_NumAnimals = ;
}
~ zoo ()
{
freeallanimals ();
delete m_pResidents;
}
unsigned int accept (animal * d); //빈 열 찾기
void Release(unsigned int pos); //동물 방출
void ListAnimals (); //Zoo 의 동물 보이기
void set filename (constchar * pf name); //파일 이름 설정
bool Save (); //파일에 동물 데이터 쓰기
bool Load (); //파일에서 동물 데이터 로드
};
unsigned intzoo:: accept (animal * d)
{
if (m _ num animals = = m _ maxanimals //반환 열 번호 은 이 동물이 열에 배치되지 않았음을 나타냅니다
p>++m_NumAnimals;
int i=;
while (m_pResidents! = NULL)
{
++i;
}
*m_pResidents = d;
리턴++I; //열 번호 1 부터 시작
}
void zoo:: 릴리즈 (unsigned int pos)
{
if (pos > M_MaxAnimals)
return;
-pos; //배열에서 일련 번호 가져오기
if (m _ presidents [pos])
{
animal * p = m _ presidents [pos]
m_pResidents[pos] = ;
-m _ numanimals;
cout < < "\n 열 해제" < < Pos < < "속의 동물, 그 동물의 정보:";
p-> WhoAmI ();
delete p;
}
else
cout< < "지정된 열에 동물이 없습니다. 해제 작업이 실패했습니다. \n"; //방출되지 않은 동물
}
voidzoo:: listanimals ()
{
if (m _ numanimals > )
{
for (unsigned int i=; I< M_MaxAnimals; +I)
{
if (m _ presidents)
{
cout < < I+1 < < "칼럼의 동물 정보:";
m_pResidents[i]-> WhoAmI ();
cout < < Endl;
}
}
}
else
cout < < "< 동물원에 동물이 없어요! > " < < Endl;
}
void zoo:: set filename (constchar * pfname)//파일 이름 설정
{
strcpy (m _;
}
boolzoo:: save ()
{
if (m _ SZ filename [] = = )
save
ofstream fout (m _ SZ 파일 이름);
if (fout.is _ open () = = false)
복귀 false;
// 먼저 총 수 저장
fout < < M_NumAnimals < < Endl;
for (unsigned int i=; I< M_MaxAnimals; +I)
{
if (m _ presidents)
{
//열 번호 동물 유형 동물 이름
fout < < I < < "< < M_pResidents[i]-> AnimalType ();
fout < < "< < M_pResidents[i]-> GetName() < < Endl;
}
}
fout.close ();
return true;
}
boolzoo:: load ()
{
if (m _ SZ filename [] = = )
sp
ifstreamfin (m _ SZ 파일 이름);
if (fin.is _ open () = = false)
return false;
bool bRet = true;
unsigned int count = ;
핀 > > Count;
if (count > M_MaxAnimals) // 잘못된 데이터
bRet = false;
else
{
for (unsigned int I = ; I< Count; ++i)
{
unsigned int index = ;
핀 > > Index; //동물이 있는 열 번호 읽기
if (index > = m_MaxAnimals) // 열 번호 확인
{
bRet = false;
break; // break for 루프
}
Animal* p = ;
char AnimalType;
char szAnimalName[64];
핀 > > AnimalType > > SzAnimalName;
스위치 (animaltype)
{
case' c': p = new cat (szanimalname); 브레크;
case' d': p = new dog (szanimalname); 브레크;
case' m': p = new monkey (szanimalname); 브레크;
default: break;
}
if (p = = )
{
bret = false;
break; // break for 루프
}
m_pResidents[index] = p;
}
}
fin.close ();
if (bRet == false) // 읽기 실패, 설정된 모든 객체 해제
freeAllAnimals ();
else
m_NumAnimals = count;
return bRet;
}
intmain (intargc, char * argv [])
{
animal * p;
Zoo zoo(2);
bool bExit = false;
while (b exit = = false)
{
bool bgoodcommand = true;
char command[128];
char Name[64];
char AnimalTy