http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h
Chapter 9 // Exercise 7
Create an enumerated type for the Book class called Genre. Have the types be fiction, nonfiction, periodical, biography, and children. Give each book a Genre and make appropriate changes to the Book constructor and member functions.
I don't particularly like using enums, I find them tedious when you need to print out data with them. Pretty much the only way to print out the info as text is via a switch statement which takes up a lot of lines and can harbour bugs if not careful.
#include "stdafx.h"
#include "std_lib_facilities.h"
enum class Genre
{
default = 1, fiction, nonfiction, periodical, biography, children
};
class Book
{
public:
Book();
~Book();
Genre getGenre() const { return m_genre; }
string getISBN() const { return m_isbn; }
string getTitle() const { return m_title; }
string getAuthor() const { return m_author; }
int getDate() const { return m_date; }
bool getStatus() const { return m_checkedOut; }
void setGenre(Genre genre) { m_genre = genre; }
void setISBN(string num1, string num2, string num3, string char1);
void setTitle(string title) { m_title = title; }
void setAuthor(string author) { m_author = author; }
void setDate(string year);
void checkBookOut() { m_checkedOut = true; };
void checkBookIn() { m_checkedOut = false; };
private:
//m_ prefix to denote member variable
Genre m_genre;
string m_isbn, m_title, m_author;
int m_date;
bool m_checkedOut;
};
//--OVERLOAD OPERATORS--//
//compare ISBN numbers
bool operator==(const Book& a, const Book& b)
{
return a.getISBN() == b.getISBN();
}
bool operator!=(const Book& a, const Book& b)
{
return a.getISBN() != b.getISBN();
}
//print out book
ostream& operator<<(ostream& os, const Book& book)
{
string genre;
switch (book.getGenre())
{
case Genre::fiction:
genre = "Fiction";
break;
case Genre::nonfiction:
genre = "Non-Fiction";
break;
case Genre::periodical:
genre = "Periodical";
break;
case Genre::biography:
genre = "Biography";
break;
case Genre::children:
genre = "Children";
break;
default:
genre = "Default";
break;
}
return os << "Title: " << book.getTitle() << endl
<< "Author: " << book.getAuthor() << endl
<< "Genre: " << genre << endl
<< "Copyright: " << book.getDate() << endl
<< "ISBN: " << book.getISBN() << endl
<< "Checked out:" << book.getStatus() << endl
<< endl;
}
//constructor
Book::Book()
{
m_genre = Genre::default;
m_isbn = m_title = m_author = "";
m_date = 0;
m_checkedOut = false;
}
//deconstructor
Book::~Book() {}
//set the ISBN
void Book::setISBN(string num1, string num2, string num3, string char1)
{
size_t check;
//check first number
check = num1.find_first_not_of("0123456789");
while (check != string::npos)
{
cout << "Not a valid ISBN number, try again: ";
cin >> num1;
check = num1.find_first_not_of("0123456789");
}
//check second number
check = num2.find_first_not_of("0123456789");
while (check != string::npos)
{
cout << "Not a valid ISBN number, try again: ";
cin >> num2;
check = num2.find_first_not_of("0123456789");
}
//check third number
check = num3.find_first_not_of("0123456789");
while (check != string::npos)
{
cout << "Not a valid ISBN number, try again: ";
cin >> num3;
check = num3.find_first_not_of("0123456789");
}
//check last character
check = char1.find_first_not_of("0123456789ABCDEFGHIJKLMNOPQRSTUVWXY");
while (check != string::npos)
{
cout << "Not a valid ISBN digit or letter, try again: ";
cin >> char1;
check = char1.find_first_not_of("0123456789ABCDEFGHIJKLMNOPQRSTUVWXY");
}
//set isbn
m_isbn = "";
m_isbn.append(num1);
m_isbn.append("-");
m_isbn.append(num2);
m_isbn.append("-");
m_isbn.append(num3);
m_isbn.append("-");
m_isbn.append(char1);
}
//set and check the year of copyright
void Book::setDate(string year)
{
size_t check;
check = year.find_first_not_of("0123456789");
while (check != string::npos || year.size() != 4)
{
cout << "Not a valid year try again: ";
cin >> year;
check = year.find_first_not_of("0123456789");
}
m_date = stoi(year);
}
int main()
{
Book lotr;
lotr.setTitle("Lord Of The Rings");
lotr.setAuthor("J.R.R Tolkien");
lotr.setGenre(Genre::fiction);
lotr.setDate("1954");
lotr.setISBN("1111", "1111", "1111", "J");
cout << lotr;
lotr.setISBN("123", "0", "4444", "6");
lotr.checkBookOut();
cout << lotr;
keep_window_open();
return 0;
}
I don't particularly like using enums, I find them tedious when you need to print out data with them. Pretty much the only way to print out the info as text is via a switch statement which takes up a lot of lines and can harbour bugs if not careful.
No comments:
Post a Comment