//第14章第1题
#ifndef WINE_H_
#define WINE_H_
#include<iostream>
#include<string>
#include<valarray>
//#include<utility>
using std::cin;
using std::cout;
using std::endl;
using std::string;
template <class T1,class T2>
class Pair
{
private:
T1 a;
T2 b;
public:
T1 &first();
T2 &second();//返回引用
T1 first()const { return a; }
T2 second()const { return b; }//直接返回
Pair(const T1 &aval, const T2 &bval) :a(aval), b(bval){}//初始化
Pair(){}
void setFirst(const T1&t1)
{
a = t1;
}
void setSecond(const T2&t2)
{
b = t2;
}
};
template<class T1,class T2>
T1 &Pair<T1, T2>::first()
{
return a;
}
template<class T1, class T2>
T2 &Pair<T1, T2>::second()
{
return b;
}
typedef std::valarray<int>ArrarInt;
typedef Pair<std::valarray<int>, std::valarray<int>>PairArray1;//最好用这个
//typedef std::pair<std::valarray<int>, std::valarray<int>>PairArray;
class Wine
{
private:
string name;
PairArray1 pa;
int wyr;
public:
Wine(const char *l, int y, const int yr[], const int bot[])
{
name = l;//可以直接赋值
wyr = y;
/* pa.first = yr;
pa.second = bot;*///这个编译不通过,所以要换
ArrarInt f(yr, y);
ArrarInt b(bot, y);
pa.setFirst(f);
pa.setSecond(b);//不过也有人用make_pairs
/*pa = std::make_pair(f, b);*///这个要用其他宏定义,
}
Wine(const char *l, int y)
{
name = l;
wyr = y;
pa.setFirst(ArrarInt(y));
pa.setSecond(ArrarInt(y));
}
void GetBottles()
{
cout << "Please enter number of"<<wyr<<" yesrs:\n";
for (int i = 0; i < wyr; i++)
{
cout << "Enter year:";
cin >> pa.first()[i];//返回的是数组,可以这样写
cin.get();//吃回车,不然就down
cout << "Enter bottles for that year:";
cin >> pa.second()[i];
cin.get();//吃回车,不然就down
}
}
int sum()
{
return pa.second().sum();//返回数组的sum方法
}
string & Label()
{
return name;
}
void Show()
{
cout << "Wine: " << name << endl;
cout << " " << "Year" << " " << "Bottles" << endl;
for (int i = 0; i < wyr; i++)
{
cout << " " << pa.first()[i] << " " << pa.second()[i] << endl;
}
}
};
#endif//第14章第1题
#ifndef WINE_H_
#define WINE_H_
#inc