Quote class:
Quote.h
#pragma once
#include <iostream>
#include <string>
class Quote {
public:
Quote() = default;
Quote(const std::string &bookNo, double book_price);
Quote(const Quote &);
Quote &operator=(const Quote &);
Quote(Quote &&);
Quote &operator=(Quote &&);
std::string isbn() const;
double print_total(std::ostream &out, Quote &item, size_t n) const;
virtual double net_price(size_t n) const;
virtual void debug() const;
virtual ~Quote();
protected:
std::string bookNo;
double price;
};
Quote.cpp
#include "Quote.h"
Quote::Quote(const std::string &bookNo, double book_price)
: bookNo(bookNo), price(book_price) {}
Quote::Quote(const Quote &q)
: bookNo(q.bookNo), price(q.price) {std::cout << "Quote copy constructor" << std::endl;}
Quote &Quote::operator=(const Quote &rhs) {
std::cout << "Quote copy assignment" << std::endl;
bookNo = rhs.bookNo;
price = rhs.price;
return *this;
}
Quote::Quote(Quote &&q)
: bookNo(std::move(q.bookNo)), price(std::move(q.price)) {
std::cout << "Quote move constructor" << std::endl;
}
Quote &Quote::operator=(Quote &&rhs) {
std::cout << "Quote move assignment" << std::endl;
bookNo = std::move(rhs.bookNo);
price = std::move(rhs.price);
return *this;
}
std::string Quote::isbn() const {
return bookNo;
}
double Quote::print_total(std::ostream &out, Quote &item, size_t n) const {
double ret = item.net_price(n);
out << "The book " << item.isbn() << " sold: " << n <<
" total price " << ret << std::endl;
return ret;
}
double Quote::net_price(size_t n) const {
return n * price;
}
void Quote::debug() const {
std::cout << "===This is a Quote call debug" << std::endl;
std::cout << "The book number is: " << bookNo << " and the price is: " << price << std::endl;
}
Quote::~Quote() {}
Disc_quote class:
Disc_quote.h
#pragma once
#include "Quote.h"
class Disc_quote : public Quote {
public:
Disc_quote() = default;
Disc_quote(const std::string &bookNo, double price, size_t qty, double discount);
Disc_quote(const Disc_quote &);
Disc_quote &operator=(const Disc_quote &);
Disc_quote(Disc_quote &&);
Disc_quote &operator=(Disc_quote &&);
virtual double net_price(size_t n) const = 0;
virtual void debug() const;
~Disc_quote();
protected:
size_t min_qty = 0;
double discount = 0.0;
};
Disc_quote.cpp
#include "Disc_quote.h"
Disc_quote::Disc_quote(const std::string &bookNo, double price, size_t qty, double discount)
: Quote(bookNo, price), min_qty(qty), discount(discount) {}
Disc_quote::Disc_quote(const Disc_quote &d)
: Quote(d), min_qty(d.min_qty), discount(d.discount) {
std::cout << "Disc_quote copy constructor" << std::endl;
}
Disc_quote &Disc_quote::operator=(const Disc_quote &rhs) {
std::cout << "Disc_quote copy assignment" << std::endl;
bookNo = rhs.bookNo;
price = rhs.price;
min_qty = rhs.min_qty;
discount = rhs.discount;
return *this;
}
Disc_quote::Disc_quote(Disc_quote &&d)
: Quote(d), min_qty(std::move(d.min_qty)), discount(std::move(d.discount)) {
std::cout << "Disc_quote move constructor" << std::endl;
}
Disc_quote &Disc_quote::operator=(Disc_quote &&rhs) {
std::cout << "Disc_quote move assignment" << std::endl;
bookNo = std::move(rhs.bookNo);
price = std::move(rhs.price);
min_qty = std::move(rhs.min_qty);
discount = std::move(rhs.discount);
return *this;
}
void Disc_quote::debug() const {
std::cout << "This is Disc_quote objec call" << std::endl;
Quote::debug();
std::cout << "The min number of books is: " << min_qty << " and the discount is: " << discount << std::endl;
}
Disc_quote::~Disc_quote() {}
Bulk_quote class:
Bulk_quote.h
#pragma once
#include "Disc_quote.h"
class Bulk_quote : public Disc_quote {
public:
Bulk_quote() = default;
Bulk_quote(const std::string &bookNo, double book_price, size_t min_qty, double discount);
using Disc_quote::Disc_quote;
Bulk_quote(const Bulk_quote &);
Bulk_quote &operator=(const Bulk_quote &);
Bulk_quote(Bulk_quote &&);
Bulk_quote &operator=(Bulk_quote &&);
virtual double net_price(size_t n) const;
virtual void debug() const;
virtual ~Bulk_quote();
};
Bulk_quote.cpp
#include "Bulk_quote.h"
Bulk_quote::Bulk_quote(const std::string &bookNo, double book_price, size_t min_qty, double discount)
: Disc_quote(bookNo, book_price, min_qty, discount) {}
Bulk_quote::Bulk_quote(const Bulk_quote &b)
: Disc_quote(b) {
std::cout << "Bulk_quote copy constructor" << std::endl;
}
Bulk_quote &Bulk_quote::operator=(const Bulk_quote &rhs) {
std::cout << "Bulk_quote copy assignment" << std::endl;
bookNo = rhs.bookNo;
price = rhs.price;
min_qty = rhs.min_qty;
discount = rhs.discount;
return *this;
}
Bulk_quote::Bulk_quote(Bulk_quote &&b)
: Disc_quote(b) {
std::cout << "Bulk_quote move constructor" << std::endl;
}
Bulk_quote &Bulk_quote::operator=(Bulk_quote &&rhs) {
std::cout << "Bulk_quote move assignment" << std::endl;
bookNo = std::move(rhs.bookNo);
price = std::move(rhs.price);
min_qty = std::move(rhs.min_qty);
discount = std::move(rhs.discount);
return *this;
}
double Bulk_quote::net_price(size_t n) const {
if (n >= min_qty) {
return n * (1 - discount) * price;
} else {
return n * price;
}
}
void Bulk_quote::debug() const {
std::cout << "===This is a Bulk_quote object call" << std::endl;
Disc_quote::debug();
std::cout << "The min number of books is: "
<< min_qty << " and the discount is: "
<< discount << std::endl;
}
Bulk_quote::~Bulk_quote() {}
Limited_quote class
Limited_quote.h
#pragma once
#include "Disc_quote.h"
class Limited_quote : public Disc_quote {
public:
Limited_quote() = default;
Limited_quote(const std::string &bookNo, double book_price, size_t min_qty, double discount, size_t max_qty);
Limited_quote(const Limited_quote &);
Limited_quote &operator=(const Limited_quote &);
Limited_quote(Limited_quote &&);
Limited_quote &operator=(Limited_quote &&);
virtual double net_price(size_t n) const;
virtual void debug() const;
~Limited_quote();
private:
size_t max_qty;
};
Limited_quote.cpp
#include "Limited_quote.h"
Limited_quote::Limited_quote(const std::string &bookNo, double book_price, size_t min_qty, double discount, size_t max_qty)
: Disc_quote(bookNo, book_price, min_qty, discount), max_qty(max_qty) {}
Limited_quote::Limited_quote(const Limited_quote &l)
: Disc_quote(l), max_qty(l.max_qty) {
std::cout << "Limited_quote copy constructor" << std::endl;
}
Limited_quote &Limited_quote::operator=(const Limited_quote &rhs) {
std::cout << "Limited_quote copy assignment" << std::endl;
bookNo = rhs.bookNo;
price = rhs.price;
min_qty = rhs.min_qty;
discount = rhs.discount;
max_qty = rhs.max_qty;
return *this;
}
Limited_quote::Limited_quote(Limited_quote &&l)
: Disc_quote(l), max_qty(std::move(l.max_qty)) {
std::cout << "Limited_quote move constructor" << std::endl;
}
Limited_quote &Limited_quote::operator=(Limited_quote &&rhs) {
std::cout << "Limited_quote move assignment" << std::endl;
bookNo = std::move(rhs.bookNo);
price = std::move(rhs.price);
min_qty = std::move(rhs.min_qty);
discount = std::move(rhs.discount);
max_qty = std::move(rhs.max_qty);
return *this;
}
double Limited_quote::net_price(size_t n) const {
if (min_qty < n && n < max_qty) {
return n * (1 - discount) * price;
} else {
return n * price;
}
}
void Limited_quote::debug() const {
std::cout << "===This is a Limited_quote object call" << std::endl;
Disc_quote::debug();
std::cout << "The max number of books is: " << max_qty << std::endl;
}
Limited_quote::~Limited_quote() {}