15.5:
.h:
#pragma once
#include<iostream>
using namespace std;
class Quote
{
public:
Quote() = default;
Quote(const string& book, double sales_price) :bookNo(book), price(sales_price) {}
string isbn() const { return this->bookNo; }
virtual double net_price(size_t n) const{ return n * price; }
virtual ~Quote() = default;
protected:
double price = 0.0;
private:
string bookNo;
};
double print_total(ostream& os, const Quote& item, size_t n);
class Bulk_quote:public Quote
{
public:
Bulk_quote() = default;
Bulk_quote(const string&, double, size_t, double);
virtual double net_price(size_t) const override;
private:
size_t min_qty = 0;
double discount = 0.0;
};
.cpp:
#include"Quote.h"
double print_total(ostream& os, const Quote& item, size_t n)
{
double ret = item.net_price(n);
os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << endl;
return ret;
}
//Bulk_quote:
Bulk_quote::Bulk_quote(const string&book, double p, size_t qty, double disc):
Quote(book,p),min_qty(qty),discount(disc){}
double Bulk_quote::net_price(size_t cnt) const
{
if (cnt >= min_qty)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
.main:
#include<iostream>
using namespace std;
#include"Quote.h"
int main()
{
Quote q("qwe", 12);
Bulk_quote q2("qwe", 12, 10, 0.1);
print_total(cout, q, 20);
print_total(cout, q2, 20);
return 0;
}
15.7:
.h:
#pragma once
#include<iostream>
using namespace std;
class Quote
{
public:
Quote() = default;
Quote(const string& book, double sales_price) :bookNo(book), price(sales_price) {}
string isbn() const { return this->bookNo; }
virtual double net_price(size_t n) const{ return n * price; }
virtual ~Quote() = default;
protected:
double price = 0.0;
private:
string bookNo;
};
double print_total(ostream& os, const Quote& item, size_t n);
class Bulk_quote:public Quote
{
public:
Bulk_quote() = default;
Bulk_quote(const string&, double, size_t, double);
virtual double net_price(size_t) const override;
private:
size_t min_qty = 0;
double discount = 0.0;
};
class Else_quote :public Quote
{
public:
Else_quote() = default;
Else_quote(const string&, double, size_t, double, size_t);
virtual double net_price(size_t) const override;
private:
size_t max_qty = 0;
double discount = 0.0;
size_t min_qty = 0;
};
.cpp:
#include"Quote.h"
double print_total(ostream& os, const Quote& item, size_t n)
{
double ret = item.net_price(n);
os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << endl;
return ret;
}
//Bulk_quote:
Bulk_quote::Bulk_quote(const string&book, double p, size_t qty, double disc):
Quote(book,p),min_qty(qty),discount(disc){}
double Bulk_quote::net_price(size_t cnt) const
{
if (cnt >= min_qty)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
//Else_quote
Else_quote::Else_quote(const string&book, double p, size_t minqty, double disc, size_t maxq):
Quote(book,p),min_qty(minqty),discount(disc),max_qty(maxq){}
double Else_quote::net_price(size_t cnt) const
{
if (cnt >= max_qty)
{
return (cnt - max_qty * discount) * price;
}
else if (cnt >= min_qty)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
.main:
#include<iostream>
using namespace std;
#include"Quote.h"
int main()
{
Quote q("qwe", 12);
Bulk_quote q2("qwe", 12, 10, 0.1);
Else_quote q3("qwe", 12, 10, 0.1, 20);
print_total(cout, q, 20);
print_total(cout, q2, 20);
print_total(cout, q3, 40);
return 0;
}
15.11:
.h:
#pragma once
#include<iostream>
using namespace std;
class Quote
{
public:
Quote() = default;
Quote(const string& book, double sales_price) :bookNo(book), price(sales_price) {}
string isbn() const { return this->bookNo; }
virtual double net_price(size_t n) const{ return n * price; }
virtual void debug() const;
virtual ~Quote() = default;
protected:
double price = 0.0;
private:
string bookNo;
};
double print_total(ostream& os, const Quote& item, size_t n);
void print_self(const Quote& item);
class Bulk_quote:public Quote
{
public:
Bulk_quote() = default;
Bulk_quote(const string&, double, size_t, double);
double net_price(size_t) const override;
void debug() const override;
private:
size_t min_qty = 0;
double discount = 0.0;
};
class Else_quote :public Quote
{
public:
Else_quote() = default;
Else_quote(const string&, double, size_t, double, size_t);
double net_price(size_t) const override;
void debug() const override;
private:
size_t max_qty = 0;
double discount = 0.0;
size_t min_qty = 0;
};
.cpp:
#include"Quote.h"
double print_total(ostream& os, const Quote& item, size_t n)
{
double ret = item.net_price(n);
os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << endl;
return ret;
}
void print_self(const Quote& item)
{
item.debug();
}
//Quote:
void Quote::debug() const
{
cout << this->bookNo << " " << this->price << endl;
}
//Bulk_quote:
Bulk_quote::Bulk_quote(const string&book, double p, size_t qty, double disc):
Quote(book,p),min_qty(qty),discount(disc){}
double Bulk_quote::net_price(size_t cnt) const
{
if (cnt >= min_qty)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
void Bulk_quote::debug() const
{
cout << this->discount << " " << this->min_qty << " " << this->price << endl;
}
//Else_quote
Else_quote::Else_quote(const string&book, double p, size_t minqty, double disc, size_t maxq):
Quote(book,p),min_qty(minqty),discount(disc),max_qty(maxq){}
double Else_quote::net_price(size_t cnt) const
{
if (cnt >= max_qty)
{
return (cnt - max_qty * discount) * price;
}
else if (cnt >= min_qty)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
void Else_quote::debug() const
{
cout << this->discount << " " << this->min_qty << " "
<< this->price << " " << this->max_qty << endl;
}
.main:
#include<iostream>
using namespace std;
#include"Quote.h"
int main()
{
Quote q("qwe", 12);
Bulk_quote q2("qwe", 12, 10, 0.1);
Else_quote q3("qwe", 12, 10, 0.1, 20);
print_total(cout, q, 20);
print_total(cout, q2, 20);
print_total(cout, q3, 40);
print_self(q);
print_self(q2);
print_self(q3);
return 0;
}
15.16:
.h:
#pragma once
#include<iostream>
using namespace std;
class Quote
{
public:
Quote() = default;
Quote(const string& book, double sales_price) :bookNo(book), price(sales_price) {}
string isbn() const { return this->bookNo; }
virtual double net_price(size_t n) const{ return n * price; }
virtual ~Quote() = default;
protected:
double price = 0.0;
private:
string bookNo;
};
double print_total(ostream& os, const Quote& item, size_t n);
class Disc_quote :public Quote
{
public:
Disc_quote() = default;
Disc_quote(const string&, double, size_t, double);
double net_price(size_t n) const = 0;
protected:
size_t quantity = 0;
double discount = 0.0;
};
class Bulk_quote:public Disc_quote
{
public:
Bulk_quote() = default;
Bulk_quote(const string&, double, size_t, double);
double net_price(size_t) const override;
};
class Else_quote :public Disc_quote
{
public:
Else_quote() = default;
Else_quote(const string&, double, size_t, double, size_t);
double net_price(size_t) const override;
private:
size_t max_qty = 0;
};
.cpp:
#include"Quote.h"
double print_total(ostream& os, const Quote& item, size_t n)
{
double ret = item.net_price(n);
os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << endl;
return ret;
}
//Quote:
//disc_quote:
Disc_quote::Disc_quote(const string& book, double p, size_t qty, double disc)
:Quote(book, p), quantity(qty), discount(disc) {}
//Bulk_quote:
Bulk_quote::Bulk_quote(const string&book, double p, size_t qty, double disc):
Disc_quote(book,p,qty,disc) {}
double Bulk_quote::net_price(size_t cnt) const
{
if (cnt >= quantity)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
//Else_quote
Else_quote::Else_quote(const string&book, double p, size_t minqty, double disc, size_t maxq):
Disc_quote(book,p,minqty,disc), max_qty(maxq){}
double Else_quote::net_price(size_t cnt) const
{
if (cnt >= max_qty)
{
return (cnt - max_qty * discount) * price;
}
else if (cnt >= quantity)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
.main:
#include<iostream>
using namespace std;
#include"Quote.h"
int main()
{
Quote q("qwe", 12);
Bulk_quote q2("qwe", 12, 10, 0.1);
Else_quote q3("qwe", 12, 10, 0.1, 20);
print_total(cout, q, 20);
print_total(cout, q2, 20);
print_total(cout, q3, 40);
return 0;
}
15.20:
#include<iostream>
using namespace std;
class Base {
public:
void pub_mem();
protected:
int prot_mem;
private:
char priv_mem;
};
struct Pub_Derv :public Base
{
void memfcn(Base& b) { b = *this; }
};
struct Priv_Derv :private Base
{
void memfcn(Base& b) { b = *this; }
};
struct Prot_Derv : protected Base
{
void memfcn(Base& b) { b = *this; }
};
struct Derived_from_public :public Pub_Derv
{
void memfcn(Base& b) { b = *this; }
};
struct Derived_from_Private :public Priv_Derv
{
void memfcn(Base& b) { b = *this; }//报错
};
struct Derived_from_Protect :public Prot_Derv
{
void memfcn(Base& b) { b = *this; }
};
int main()
{
Pub_Derv d1;
Priv_Derv d2;
Base* p = &d1;
return 0;
}
15.23:
using Base::fcn;
15.26:
.h:
#pragma once
#include<iostream>
using namespace std;
class Quote
{
public:
Quote() = default;
Quote(const Quote&q):bookNo(q.bookNo),price(q.price)
{
cout << "Quote(const Quote&q)" << endl;
}
Quote(Quote&&q):bookNo(std::move(q.bookNo)),price(std::move(q.price))
{
cout << "Quote(Quote&&q)" << endl;
}
Quote& operator=(const Quote&);
Quote& operator=(Quote&&);
Quote(const string& book, double sales_price) :bookNo(book), price(sales_price) {}
string isbn() const { return this->bookNo; }
virtual double net_price(size_t n) const{ return n * price; }
virtual ~Quote() = default;
protected:
double price = 0.0;
private:
string bookNo;
};
double print_total(ostream& os, const Quote& item, size_t n);
class Disc_quote :public Quote
{
public:
Disc_quote() = default;
Disc_quote(const Disc_quote& q) : Quote(q), quantity(q.quantity), discount(q.discount)
{
std::cout << "Disc_quote(const Disc_quote &q)" << std::endl;
}
Disc_quote(Disc_quote&& q) : Quote(std::move(q)), quantity(std::move(q.quantity)), discount(std::move(q.discount))
{
std::cout << "Disc_quote(Disc_quote && q)" << std::endl;
}
Disc_quote& operator=(const Disc_quote&);
Disc_quote& operator=(Disc_quote&&);
Disc_quote(const string&, double, size_t, double);
double net_price(size_t n) const = 0;
protected:
size_t quantity = 0;
double discount = 0.0;
};
class Bulk_quote:public Disc_quote
{
public:
Bulk_quote(const Bulk_quote& q) :Disc_quote(q)
{
cout << "Bulk_quote(const Bulk_quote& q)" << endl;
}
Bulk_quote(Bulk_quote&& q) :Disc_quote(std::move(q))
{
cout << "Bulk_quote(Bulk_quote&& q) :Disc_quote(std::move(q))" << endl;
}
Bulk_quote& operator=(const Bulk_quote&);
Bulk_quote& operator=(Bulk_quote&&);
Bulk_quote() = default;
Bulk_quote(const string&, double, size_t, double);
double net_price(size_t) const override;
};
class Else_quote :public Disc_quote
{
public:
Else_quote() = default;
Else_quote(const string&, double, size_t, double, size_t);
double net_price(size_t) const override;
private:
size_t max_qty = 0;
};
.cpp:
#include"Quote.h"
double print_total(ostream& os, const Quote& item, size_t n)
{
double ret = item.net_price(n);
os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << endl;
return ret;
}
//Quote:
Quote& Quote::operator=(const Quote&q)
{
cout << "Quote& Quote::operator=(const Quote&q)" << endl;
this->bookNo = q.bookNo;
this->price = q.price;
return *this;
}
Quote& Quote::operator=(Quote&&q)
{
cout << "Quote& Quote::operator=(Quote&&q)" << endl;
this->bookNo = std::move(q.bookNo);
this->price = std::move(q.price);
return *this;
}
//Disc_quote:
Disc_quote::Disc_quote(const string& book, double p, size_t qty, double disc)
:Quote(book, p), quantity(qty), discount(disc) {}
Disc_quote& Disc_quote::operator=(const Disc_quote&q)
{
cout << "Disc_quote& Disc_quote::operator=(const Disc_quote&q)" << endl;
Quote::operator=(q);
this->quantity = q.quantity;
this->discount = q.discount;
return *this;
}
Disc_quote& Disc_quote::operator=(Disc_quote&&q)
{
cout << "Disc_quote& Disc_quote::operator=(Disc_quote&&q)" << endl;
Quote::operator=(std::move(q));
this->quantity = std::move(q.quantity);
this->discount = std::move(q.discount);
return *this;
}
//Bulk_quote:
Bulk_quote::Bulk_quote(const string&book, double p, size_t qty, double disc):
Disc_quote(book,p,qty,disc) {}
double Bulk_quote::net_price(size_t cnt) const
{
if (cnt >= quantity)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
Bulk_quote& Bulk_quote::operator=(const Bulk_quote&q)
{
cout << "Bulk_quote& Bulk_quote::operator=(const Bulk_quote&q)" << endl;
Disc_quote::operator=(q);
return *this;
}
Bulk_quote& Bulk_quote::operator=(Bulk_quote&&q)
{
cout << "Bulk_quote& Bulk_quote::operator=(Bulk_quote&&q)" << endl;
Disc_quote::operator=(std::move(q));
return *this;
}
//Else_quote
Else_quote::Else_quote(const string&book, double p, size_t minqty, double disc, size_t maxq):
Disc_quote(book,p,minqty,disc), max_qty(maxq){}
double Else_quote::net_price(size_t cnt) const
{
if (cnt >= max_qty)
{
return (cnt - max_qty * discount) * price;
}
else if (cnt >= quantity)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
15.27:
.h:
#pragma once
#include<iostream>
using namespace std;
class Quote
{
public:
Quote() = default;
Quote(const Quote&q):bookNo(q.bookNo),price(q.price)
{
cout << "Quote(const Quote&q)" << endl;
}
Quote(Quote&&q):bookNo(std::move(q.bookNo)),price(std::move(q.price))
{
cout << "Quote(Quote&&q)" << endl;
}
Quote& operator=(const Quote&);
Quote& operator=(Quote&&);
Quote(const string& book, double sales_price) :bookNo(book), price(sales_price) {}
string isbn() const { return this->bookNo; }
virtual double net_price(size_t n) const{ return n * price; }
virtual ~Quote() = default;
protected:
double price = 0.0;
private:
string bookNo;
};
double print_total(ostream& os, const Quote& item, size_t n);
class Disc_quote :public Quote
{
public:
Disc_quote() = default;
Disc_quote(const Disc_quote& q) : Quote(q), quantity(q.quantity), discount(q.discount)
{
std::cout << "Disc_quote(const Disc_quote &q)" << std::endl;
}
Disc_quote(Disc_quote&& q): Quote(std::move(q)), quantity(std::move(q.quantity)), discount(std::move(q.discount))
{
std::cout << "Disc_quote(Disc_quote && q)" << std::endl;
}
Disc_quote& operator=(const Disc_quote&);
Disc_quote& operator=(Disc_quote&&);
Disc_quote(const string&, double, size_t, double);
double net_price(size_t n) const = 0;
protected:
size_t quantity = 0;
double discount = 0.0;
};
class Bulk_quote:public Disc_quote
{
public:
using Disc_quote::Disc_quote;
Bulk_quote(const Bulk_quote& q) :Disc_quote(q)
{
cout << "Bulk_quote(const Bulk_quote& q)" << endl;
}
Bulk_quote(Bulk_quote&& q) :Disc_quote(std::move(q))
{
cout << "Bulk_quote(Bulk_quote&& q) :Disc_quote(std::move(q))" << endl;
}
Bulk_quote& operator=(const Bulk_quote&);
Bulk_quote& operator=(Bulk_quote&&);
Bulk_quote() = default;
//Bulk_quote(const string&, double, size_t, double);
double net_price(size_t) const override;
};
class Else_quote :public Disc_quote
{
public:
Else_quote() = default;
Else_quote(const string&, double, size_t, double, size_t);
double net_price(size_t) const override;
private:
size_t max_qty = 0;
};
.cpp:
#include"Quote.h"
double print_total(ostream& os, const Quote& item, size_t n)
{
double ret = item.net_price(n);
os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << endl;
return ret;
}
//Quote:
Quote& Quote::operator=(const Quote&q)
{
cout << "Quote& Quote::operator=(const Quote&q)" << endl;
this->bookNo = q.bookNo;
this->price = q.price;
return *this;
}
Quote& Quote::operator=(Quote&&q)
{
cout << "Quote& Quote::operator=(Quote&&q)" << endl;
this->bookNo = std::move(q.bookNo);
this->price = std::move(q.price);
return *this;
}
//Disc_quote:
Disc_quote::Disc_quote(const string& book, double p, size_t qty, double disc)
:Quote(book, p), quantity(qty), discount(disc) {}
Disc_quote& Disc_quote::operator=(const Disc_quote&q)
{
cout << "Disc_quote& Disc_quote::operator=(const Disc_quote&q)" << endl;
Quote::operator=(q);
this->quantity = q.quantity;
this->discount = q.discount;
return *this;
}
Disc_quote& Disc_quote::operator=(Disc_quote&&q)
{
cout << "Disc_quote& Disc_quote::operator=(Disc_quote&&q)" << endl;
Quote::operator=(std::move(q));
this->quantity = std::move(q.quantity);
this->discount = std::move(q.discount);
return *this;
}
//Bulk_quote:
//Bulk_quote::Bulk_quote(const string&book, double p, size_t qty, double disc):
//Disc_quote(book,p,qty,disc) {}
double Bulk_quote::net_price(size_t cnt) const
{
if (cnt >= quantity)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
Bulk_quote& Bulk_quote::operator=(const Bulk_quote&q)
{
cout << "Bulk_quote& Bulk_quote::operator=(const Bulk_quote&q)" << endl;
Disc_quote::operator=(q);
return *this;
}
Bulk_quote& Bulk_quote::operator=(Bulk_quote&&q)
{
cout << "Bulk_quote& Bulk_quote::operator=(Bulk_quote&&q)" << endl;
Disc_quote::operator=(std::move(q));
return *this;
}
//Else_quote
Else_quote::Else_quote(const string&book, double p, size_t minqty, double disc, size_t maxq):
Disc_quote(book,p,minqty,disc), max_qty(maxq){}
double Else_quote::net_price(size_t cnt) const
{
if (cnt >= max_qty)
{
return (cnt - max_qty * discount) * price;
}
else if (cnt >= quantity)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
15.28:
#include <iostream>
using namespace std;
#include <string>
#include "Quote.h"
#include<vector>
int main()
{
Quote q("qwe", 12);
Bulk_quote q2("qwe", 12, 10, 0.1);
vector<Quote> basket;
basket.push_back(q);
basket.push_back(q2);
double sum = 0;
for (vector<Quote>::const_iterator ip = basket.cbegin(); ip != basket.cend(); ++ip)
{
cout << ip->net_price(30) << endl;
sum += ip->net_price(30);
}
cout << sum << endl;
return 0;
}
15.29:
#include <iostream>
using namespace std;
#include <string>
#include "Quote.h"
#include<vector>
int main()
{
Quote q("qwe", 12);
Bulk_quote q2("qwe", 12, 10, 0.1);
vector<shared_ptr<Quote>> basket;
basket.push_back(make_shared<Quote>(q));
basket.push_back(make_shared<Bulk_quote>(q2));
double sum = 0;
for (vector<shared_ptr<Quote>>::const_iterator ip = basket.cbegin(); ip != basket.cend(); ++ip)
{
cout << (*ip)->net_price(20) << endl;
sum += (*ip)->net_price(20);
}
cout << sum << endl;//进行了动态绑定
return 0;
}
15.30:
.h:
#pragma once
#include<iostream>
using namespace std;
#include<set>
class Quote
{
public:
Quote() = default;
Quote(const Quote&q):bookNo(q.bookNo),price(q.price)
{
cout << "Quote(const Quote&q)" << endl;
}
Quote(Quote&&q)noexcept:bookNo(std::move(q.bookNo)),price(std::move(q.price))
{
cout << "Quote(Quote&&q)" << endl;
}
Quote& operator=(const Quote&);
Quote& operator=(Quote&&)noexcept;
Quote(const string& book, double sales_price) :bookNo(book), price(sales_price) {}
string isbn() const { return this->bookNo; }
virtual double net_price(size_t n) const{ return n * price; }
virtual Quote* clone()const&
{
return new Quote(*this);
}
virtual Quote* clone()&&
{
return new Quote(std::move(*this));
}
virtual ~Quote() = default;
protected:
double price = 0.0;
private:
string bookNo;
};
double print_total(ostream& os, const Quote& item, size_t n);
class Disc_quote :public Quote
{
public:
Disc_quote() = default;
Disc_quote(const Disc_quote& q) : Quote(q), quantity(q.quantity), discount(q.discount)
{
std::cout << "Disc_quote(const Disc_quote &q)" << std::endl;
}
Disc_quote(Disc_quote&& q)noexcept: Quote(std::move(q)), quantity(std::move(q.quantity)), discount(std::move(q.discount))
{
std::cout << "Disc_quote(Disc_quote && q)" << std::endl;
}
Disc_quote& operator=(const Disc_quote&);
Disc_quote& operator=(Disc_quote&&)noexcept;
Disc_quote(const string&, double, size_t, double);
double net_price(size_t n) const = 0;
protected:
size_t quantity = 0;
double discount = 0.0;
};
class Bulk_quote:public Disc_quote
{
public:
using Disc_quote::Disc_quote;
Bulk_quote(const Bulk_quote& q) :Disc_quote(q)
{
cout << "Bulk_quote(const Bulk_quote& q)" << endl;
}
Bulk_quote(Bulk_quote&& q) noexcept:Disc_quote(std::move(q))
{
cout << "Bulk_quote(Bulk_quote&& q) :Disc_quote(std::move(q))" << endl;
}
Bulk_quote& operator=(const Bulk_quote&);
Bulk_quote& operator=(Bulk_quote&&)noexcept;
Bulk_quote() = default;
//Bulk_quote(const string&, double, size_t, double);
double net_price(size_t) const override;
Bulk_quote* clone()const&
{
return new Bulk_quote(*this);
}
Bulk_quote* clone()&&
{
return new Bulk_quote(std::move(*this));
}
};
class Else_quote :public Disc_quote
{
public:
Else_quote() = default;
Else_quote(const string&, double, size_t, double, size_t);
double net_price(size_t) const override;
private:
size_t max_qty = 0;
};
class Basket
{
public:
void add_item(const Quote& sale);
void add_item(Quote&& sale);
double total_recipt(ostream&) const;
private:
static bool compare(const shared_ptr<Quote>& lhs, const shared_ptr<Quote>& rhs)
{
return lhs->isbn() < rhs->isbn();
}
multiset<shared_ptr<Quote>,decltype(compare)*>items{compare};
};
.cpp:
#include"Quote.h"
double print_total(ostream& os, const Quote& item, size_t n)
{
double ret = item.net_price(n);
os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << endl;
return ret;
}
//Quote:
Quote& Quote::operator=(const Quote&q)
{
cout << "Quote& Quote::operator=(const Quote&q)" << endl;
this->bookNo = q.bookNo;
this->price = q.price;
return *this;
}
Quote& Quote::operator=(Quote&&q) noexcept
{
cout << "Quote& Quote::operator=(Quote&&q)" << endl;
this->bookNo = std::move(q.bookNo);
this->price = std::move(q.price);
return *this;
}
//Disc_quote:
Disc_quote::Disc_quote(const string& book, double p, size_t qty, double disc)
:Quote(book, p), quantity(qty), discount(disc) {}
Disc_quote& Disc_quote::operator=(const Disc_quote&q)
{
cout << "Disc_quote& Disc_quote::operator=(const Disc_quote&q)" << endl;
Quote::operator=(q);
this->quantity = q.quantity;
this->discount = q.discount;
return *this;
}
Disc_quote& Disc_quote::operator=(Disc_quote&&q) noexcept
{
cout << "Disc_quote& Disc_quote::operator=(Disc_quote&&q)" << endl;
Quote::operator=(std::move(q));
this->quantity = std::move(q.quantity);
this->discount = std::move(q.discount);
return *this;
}
//Bulk_quote:
//Bulk_quote::Bulk_quote(const string&book, double p, size_t qty, double disc):
//Disc_quote(book,p,qty,disc) {}
double Bulk_quote::net_price(size_t cnt) const
{
if (cnt >= quantity)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
Bulk_quote& Bulk_quote::operator=(const Bulk_quote&q)
{
cout << "Bulk_quote& Bulk_quote::operator=(const Bulk_quote&q)" << endl;
Disc_quote::operator=(q);
return *this;
}
Bulk_quote& Bulk_quote::operator=(Bulk_quote&&q)noexcept
{
cout << "Bulk_quote& Bulk_quote::operator=(Bulk_quote&&q)" << endl;
Disc_quote::operator=(std::move(q));
return *this;
}
//Else_quote
Else_quote::Else_quote(const string&book, double p, size_t minqty, double disc, size_t maxq):
Disc_quote(book,p,minqty,disc), max_qty(maxq){}
double Else_quote::net_price(size_t cnt) const
{
if (cnt >= max_qty)
{
return (cnt - max_qty * discount) * price;
}
else if (cnt >= quantity)
{
return cnt * (1 - discount) * price;
}
else
{
return cnt * price;
}
}
//Basket:
void Basket::add_item(const Quote& sale)
{
items.insert(shared_ptr<Quote>(sale.clone()));
}
void Basket::add_item(Quote&& sale)
{
items.insert(shared_ptr<Quote>(std::move(sale).clone()));
}
double Basket::total_recipt(ostream&os) const
{
double sum = 0.0;
for (auto it = items.cbegin(); it != items.cend(); it = items.upper_bound(*it))
{
sum += print_total(os, **it, items.count(*it));
}
os << "Total sale: " << sum << endl;
return sum;
}
.main:
#include <iostream>
using namespace std;
#include <string>
#include "Quote.h"
#include<vector>
int main()
{
Quote q("qwe", 12);
Bulk_quote q2("qwe", 12, 10, 0.1);
Bulk_quote q3 = std::move(q2);
Basket b;
b.add_item(q);
b.add_item(q3);
b.total_recipt(cout);
return 0;
}