일단 과제 내용은 Queue라는 객체랑 Person이라는 객체를 선언하고 나서 뭔가 이리저리 하는 과제임
과제하다가 도저히 내 머리로는 안되는 부분이 있어서 sos 요청해봄
class Person {
friend class Queue;
char* pid;
char* pname;
int age;
public:
Person(char* id, char* name, int age) : age(age)
{
pid = new char[sizeof(id)+1]; pname = new char[sizeof(name)+1];
strcpy(pid, id); strcpy(pname, name);
}
~Person()
{
delete[] pid; delete[] pname;
pid = nullptr; pname = nullptr;
}
friend ostream& operator<<(ostream&, const Person&);
};
class Queue {
int front, rear;
Person* queue[100];
public:
Queue()
{
front = 0; rear = 0;
}
~Queue()
{
for (int i = 0; i < this->rear; i++)
{
delete[] queue[i];
}
}
void Add(const Person&);
Person& Delete();
void Show();
int GetFront() { return front; }
int GetRear() { return rear; }
};
Person 객체랑 Queue 객체의 내용은 다음과 같음. 과제 해결 수준의 코딩이니 막 엄격하게는 안 짰음
int main() {
Person* p[10];
Queue q1, q2;
while (1)
{
char sno[10];
char sname[20];
int year;
int select;
cout << "\nSelect command 1: AddBatch(), 2: AddOne(1개 객체를 화면 입력받아), 3. Delete, 4: Show, 5. quit => ";
cin >> select;
switch (select) {
case 1://AddBatch
{
cout << endl << "10개 큐에 입력" << endl;
Person p0("s1", "hong", 12);
Person p1("s2", "kim", 22);
Person p2("s3", "lee", 23);
Person p3("s4", "park", 24);
p[0] = &p0; p[1] = &p1; p[2] = &p2; p[3] = &p3;
for (int i = 0; i < 4; i++) {
q1.Add(*p[i]);
}
break;
}
case 2://AddOne
{
cout << endl << "1개 객체를 화면 입력받아" << endl;
cin >> sno >> sname >> year;
//Person* px = new Person(sno, sname, year); //new는 주소를 반환한다
Person px = Person(sno, sname, year);
q1.Add(px);
break;
}
case 3://Delete
{
cout << endl << "Delete" << endl;
Person result = q1.Delete();
cout << "삭제된 객체:";
q2.Add(result);
cout << result;
//delete[] &result;
break;
}
case 4://Show - 큐의 상태를 출력
{
cout << endl << "front = " << q1.GetFront() << endl;
cout << "rear = " << q1.GetRear() << endl;
//큐에 있는 객체들을 show()를 사용하여 출력
q1.Show();
cout << "삭제된 객체들을 저장한 q2의 객체들을 출력\n";
q2.Show();
break;
}
default:
exit(0);
break;
}
}
system("pause");
return 1;
}
main 함수의 내용은 이럼.
여기서 문제가 되는게 스위치 3번 구문인데...
Queue 클래스의 front랑 rear 값이 같으면 Queue라는 객체가 비어있다라고 판단하고 "Queue empty"라는 문장을 출력한 후에 (" ", " ", 0)의 값을 담은 Person 객체를 return 하고 같지 않으면 result에 그 삭제가 됐다고 판단한 객체를 리턴하는 함수가 Delete()임
여기서 문제가 되는게 void Queue::Delete() 함수임. 다른 함수는 문제가 없어서 올리지는 않겠음.
Person& Queue::Delete()
{
if (this->front == this->rear)
{
Person* emptyper = new Person(" ", " ", 0);
cout << "queue empty" << endl;
return *emptyper;
}
return *(this->queue[this->front++]);
}
이렇게 짰는데 일단 코드는 문제없이 돌아감. 문제없이 돌아가는데...
이렇게 짜니까 Delete() 함수에서 동적 할당한 포인터는 어디서 해제해줘야 하는가 하는 난관에 봉착했음.
아무리 생각해도 해제할 데가 없어서 동적할당 없이 해당 코드를 짜고 싶은데
혹시 코붕이들의 지식을 빌릴 수 있을까
교수님께서 main 함수는 건드리지 말라고 하셔서 그러는데 혹시 괜찮은 방법이 있으면 알려줘