C++ primer习题记录——第十五章

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值