8.6 도서 삭제 및 소멸

마지막으로 도서 삭제 기능과 소멸자를 구현합시다.

void App::RemoveBook() //도서 삭제
{

장르를 선택하세요.

    Genre *genre = SelectGenre();

잘못 선택하였으면 메시지를 출력하고 종료합니다.

    if(genre == 0)
    {
        cout<<"잘못 선택하였습니다."<<endl;
        return;
    }

장르에 도서 삭제 메서드를 호출하세요. 아직 추가하지 않은 메서드입니다. 장르의 RemoveBook 메서드는 도서의 ISBN을 반환해야 합니다. 만약 이를 하지 않으면 이미 소멸한 도서 개체가 App의 bookdic에 남아있어 버그가 발생합니다.

    string isbn = genre->RemoveBook();

isbn을 인자로 bookdic에 보관한 값을 0으로 리셋하세요.

    bookdic[isbn] = 0;   
}

Genre 클래스에 RemoveBook 메서드를 추가하세요.

class Genre
{
    ...중략...
    string RemoveBook();
};

Genre의 RemoveBook을 구현합시다.

string Genre::RemoveBook()
{

삭제할 도서 구분자를 입력받습니다.

    cout<<"장르 내 도서 구분자(1~100):";
    int bnum = ehglobal::getnum();

입력한 도서 구분자가 유효한 값이 아니면 메시지를 출력하고 빈 문자열을 반환하세요.

    if((bnum<1)||(bnum>100))
    {
        cout<<"범위를 벗어난 도서 구분자입니다."<<endl;        
        return "";
    }    

도서 개체가 있다면 도서의 ISBN을 구합니다. 아직 Book 클래스에 추가하지 않은 메서드입니다.

    if(books[bnum-1])
    {
        string isbn = books[bnum-1]->GetISBN();

그리고 도서 개체를 소멸한 후에 0으로 리셋하세요.

        delete books[bnum-1];
        books[bnum-1] = 0;

isbn을 반환하세요.

        return isbn;
    }

입력한 도서가 없으면 메시지를 출력하고 빈 문자열을 반환하세요.

    cout<<"없는 도서입니다."<<endl;
    return "";
}

Book 클래스에 ISBN 접근자 GetISBN 메서드를 추가하세요.

class Book
{
    ...중략...
    string GetISBN()const;
};

접근자 GetISBN 메서드를 소스 파일에 구현하세요.

string Book::GetISBN()const
{
    return isbn;
}

이제 소멸자를 구현합시다.

App::~App(void)
{

App에서 생성한 장르 개체를 소멸합니다. 반복자를 이용하여 전체 장르 개체를 소멸하세요.

    GIter seek = genres.begin();
    GIter last = genres.end();
    Genre *genre = 0;
    for(   ;seek != last ; ++seek)
    {
        genre = *seek;
        delete genre;
    }
}

장르 소멸자에서는 인덱스 연산으로 값이 참인 모든 도서 개체를 소멸하세요.

Genre::~Genre(void)
{
    for(int index=0; index<max_book;++index)
    {
        if(books[index])
        {
            delete books[index];
        }
    }
}

이제 빌드한 후 테스트해 보세요. 물론 잘못 작성한 부분이 있으면 오류를 수정해야겠죠.