C++primer 第七章

本章主要一步步构造类。

7.2

#pragma once
#include <iostream>
#include <string>
using namespace std;

struct Sales_data {
	std::string isbn() const { return bookNo; }
	Sales_data& combine(const Sales_data&);

	std::string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};

Sales_data& Sales_data::combine(const Sales_data &rhs)
{
	units_sold += rhs.units_sold;
	revenue += rhs.revenue;

	return *this;
}

7.4&&7.5

#include <iostream>
#include <string>

struct Person {
	std::string get_name() const { return name; }
	std::string get_adress()const { return adress; }

	std::string name;
	std::string adress;
};

7.6

#pragma once
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <iostream>
#include <string>
using namespace std;

struct Sales_data {
	std::string isbn() const { return bookNo; }
	Sales_data& combine(const Sales_data&);
	double avg_price()const;

	std::string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};
std::istream& read(istream&, Sales_data&);
std::ostream& print(ostream&, const Sales_data&);
Sales_data add(const Sales_data&, const Sales_data&);

Sales_data& Sales_data::combine(const Sales_data &rhs)
{
	units_sold += rhs.units_sold;
	revenue += rhs.revenue;

	return *this;
}

double Sales_data::avg_price() const
{
	if (units_sold) {
		return revenue / units_sold;
	}
	else {
		return 0;
	}
}

istream& read(istream& is, Sales_data& item)
{
	double price = 0;
	is >> item.bookNo >> item.units_sold >> price;
	item.revenue = item.units_sold*price;

	return is;
}

ostream& print(ostream& os, const Sales_data& item)
{
	os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price();
	
	return os;
}

Sales_data add(const Sales_data& lhs, const Sales_data& rhs)
{
	Sales_data sum = lhs;
	sum.combine(rhs);

	return sum;
}

#endif

7.9

#pragma once
#ifndef PERSON_H
#define PERSON_H
#include <iostream>
#include <string>
using namespace std;

struct Person {
	std::string get_name() const { return name; }
	std::string get_adress()const { return adress; }

	std::string name;
	std::string adress;
};
std::istream& read(istream&, Person&);
std::ostream& print(ostream&, const Person&);

istream& read(istream& is, Person& people)
{
	is >> people.name >> people.adress;

	return is;
}

ostream& print(ostream& os, const Person& people)
{
	os << people.get_name() << " " << people.get_adress();

	return os;
}

#endif

7.11

#include <iostream>
#include <string>
#include "Sales_data.h"
using namespace std;

int main()
{
	Sales_data item1;
	Sales_data item2("C++ Primer");
	Sales_data item3("C++ Primer", 10, 128);
	Sales_data item4(cin);
	
	print(cout, item1);
	cout << endl;
	print(cout, item2);
	cout << endl;
	print(cout, item3);
	cout << endl;
	print(cout, item4);
	cout << endl;
}

7.12
	Sales_data(std::istream& is)
	{
		double price = 0;
		is >> bookNo >> units_sold >> price;
		revenue = price*units_sold;
	}

7.15

	Person() = default;
	Person(const string& s) :name(s), adress("Can't get adress") {}
	Person(const string& s1, const string& s2) :name(s1), adress(s2) {}

7.32

#pragma once
#ifndef SCREEN_H
#define SCREEN_H
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Screen {
	friend class Windows_mgr;
public:
	typedef std::string::size_type pos;
	Screen() = default;
	Screen(pos ht, pos wd, char c) :height(ht), width(wd), contents(ht*wd, c) {}
	
	char get() const { return contents[cursor]; }
	char get(pos, pos) const;
	Screen& move(pos, pos);
	Screen& set(char);
	Screen& set(pos, pos, char);
	Screen& display(std::ostream& os) { do_display(os); return *this; }
	const Screen& display(std::ostream& os) const { do_display(os); return *this; }
private:
	void do_display(std::ostream& os)const { os << contents; }

	pos cursor = 0;
	pos height = 0;
	pos width = 0;
	std::string contents;
};

inline char Screen::get(pos r, pos c) const
{
	pos row = r*width;
	
	return contents[row + c];
}
inline Screen& Screen::move(pos r, pos c)
{
	pos row = r*width;
	cursor = row + c;
	
	return *this;
}
inline Screen& Screen::set(char ch)
{
	contents[cursor] = ch;
	
	return *this;
}
inline Screen& Screen::set(pos r, pos c, char ch)
{
	contents[r*width + c] = ch;

	return *this;
}

class Windows_mgr {
public:
	using ScreenIndex = std::vector<Screen>::size_type;
	void clear(ScreenIndex);
private:
	std::vector<Screen> screens{ Screen(24,80,' ') };
};

void Windows_mgr::clear(ScreenIndex i)
{
	Screen &s = screens[i];
	s.contents = string(s.height*s.width, ' ');
}
#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值