C++ Primer Plus, Chapter 14, excercise

1.Wine类有一个string对象和一个Pair对象,后者有两个”valarray<’int>”对象 (包含)

//wine.h
#ifndef WINE_H_
#define WINE_H_
#include <valarray>
#include <string>

typedef std::valarray<int> ArrayInt;
typedef std::pair<ArrayInt, ArrayInt> PairArray;
class Wine
{
private:
    std::string label;
    PairArray arr;
    int year;
public:
    Wine() {};
    Wine(const char * l, int y, const int yr[], const int bot[]);
    Wine(const char * l, int y);
    void Getbottles();
    std::string & Label() { return label; }
    int sum();
    void show() const;
};
#endif

//wine.cpp
#include "stdafx.h"
#include "wine.h"
#include <iostream>

Wine::Wine(const char * l, int y, const int yr[], const int bot[]) :label(l), year(y)
{
    arr.first = ArrayInt(year);
    arr.second = ArrayInt(year);
    for (int i = 0; i < year; i++)
    {
        arr.first[i] = yr[i]; //first and second 是pair的属性值,不是方法,不能有()
        arr.second[i] = bot[i];
    }

}
Wine::Wine(const char * l, int y) :label(l), year(y)
{
    arr.first = ArrayInt(year);    //需要将数组定义一下,初始化,不然没有分配内存
    arr.second = ArrayInt(year);
}
void Wine::Getbottles()
{
    std::cout << "Enter Gully Wash data for " << year << " year(s):\n";
    for (int i = 0; i < year; i++)
    {
        std::cout << "Enter year: ";
        std::cin >> arr.first[i];
        std::cout << "Enter bottles for that year: ";
        std::cin >> arr.second[i];
    }
}
int Wine::sum()
{
    return arr.second.sum();
}
void Wine::show() const
{
    std::cout << "Wine: " << label << "\n";
    std::cout << "\tYear\tBottles\n";
    for (int i = 0; i < year; i++)
        std::cout << "\t" << arr.first[i] << "\t" << arr.second[i] << "\n";
}

//main.cpp
#include "stdafx.h"
#include "wine.h"
#include <iostream>
#include <ctime>

int main()
{
    using std::cout;
    using std::cin;
    using std::endl;

    cout << "Enter name of wine: ";
    char lab[50];
    cin.getline(lab, 50);
    cout << "Enter number of years: ";
    int yrs;
    cin >> yrs;

    Wine holding(lab, yrs);
    holding.Getbottles();
    holding.show();

    const int YRS = 3;
    int y[YRS] = { 1993, 1995, 1998 };
    int b[YRS] = { 48, 60, 72 };
    Wine more("Gushing Grape Red", YRS, y, b);
    more.show();
    cout << "Total bottles for " << more.Label()
        << ": " << more.sum() << endl;
    cout << "Bye\n";

    clock_t delay = 100 * CLOCKS_PER_SEC;
    clock_t start = clock();
    while (clock() - start < delay)
        ;
    return 0;
}

2.采用私有继承完成1

//wine.h
#ifndef WINE_H_
#define WINE_H_
#include <valarray>
#include <string>

typedef std::valarray<int> ArrayInt;
typedef std::pair<ArrayInt, ArrayInt> PairArray;
class Wine:private std::string, private PairArray
{
private:
    int year;
public:
    Wine() {};
    Wine(const char * l, int y, const int yr[], const int bot[]);
    Wine(const char * l, int y);
    void Getbottles();
    const std::string & Label() { return (const std::string &) *this; } //强制类型转换
    int sum();
    void show() const;
};
#endif

//wine.cpp
#include "stdafx.h"
#include "wine.h"
#include <iostream>

Wine::Wine(const char * l, int y, const int yr[], const int bot[]) :std::string(l), year(y)
{
    PairArray::first = ArrayInt(year);  //类名和作用域解析运算符
    PairArray::second = ArrayInt(year);
    for (int i = 0; i < year; i++)
    {
        PairArray::first[i] = yr[i]; //first and second 是pair的属性值,不是方法,不能有()
        PairArray::second[i] = bot[i];
    }

}
Wine::Wine(const char * l, int y) :std::string(l), year(y)
{
    PairArray::first = ArrayInt(year);    //需要将数组定义一下,初始化,不然没有分配内存
    PairArray::second = ArrayInt(year);
}
void Wine::Getbottles()
{
    std::cout << "Enter Gully Wash data for " << year << " year(s):\n";
    for (int i = 0; i < year; i++)
    {
        std::cout << "Enter year: ";
        std::cin >> PairArray::first[i];
        std::cout << "Enter bottles for that year: ";
        std::cin >> PairArray::second[i];
    }
}
int Wine::sum()
{
    return PairArray::second.sum();
}
void Wine::show() const
{
    std::cout << "Wine: " << (const std::string &) *this << "\n";
    std::cout << "\tYear\tBottles\n";
    for (int i = 0; i < year; i++)
        std::cout << "\t" << PairArray::first[i] << "\t" << PairArray::second[i] << "\n";
}

//main.cpp
#include "stdafx.h"
#include "wine.h"
#include <iostream>
#include <ctime>

int main()
{
    using std::cout;
    using std::cin;
    using std::endl;

    cout << "Enter name of wine: ";
    char lab[50];
    cin.getline(lab, 50);
    cout << "Enter number of years: ";
    int yrs;
    cin >> yrs;

    Wine holding(lab, yrs);
    holding.Getbottles();
    holding.show();

    const int YRS = 3;
    int y[YRS] = { 1993, 1995, 1998 };
    int b[YRS] = { 48, 60, 72 };
    Wine more("Gushing Grape Red", YRS, y, b);
    more.show();
    cout << "Total bottles for " << more.Label()
        << ": " << more.sum() << endl;
    cout << "Bye\n";

    clock_t delay = 100 * CLOCKS_PER_SEC;
    clock_t start = clock();
    while (clock() - start < delay)
        ;
    return 0;
}

3.定义一个QueueTp模板,用一个指向Worker类的指针队列测试该模板

不太懂,木有做

4.Person类, 多重继承(MI)

//person.h
#ifndef PERSON_H_
#define PERSON_H_
#include <string>
class Person
{
private:
    std::string firstname;
    std::string lastname;
protected:
    virtual void Data() const;
    virtual void Get();
public:
    Person(const char * fn = "null", const char * ln = "null");
    virtual void Show() = 0;
    virtual void Set() = 0;
    virtual ~Person() = 0;
};

class Gunslinger :virtual public Person
{
private:
    int number;
    double tm; //把拔枪的时间作为成员,直接输入
protected:
    void Data();
    void Get();
public:
    Gunslinger(int n = 0, const char * fn = "null", const char * ln = "null");
    Gunslinger(int n, const Person & ps);
    double Draw();
    void Show();
    void Set();
};

class PokerPlayer :virtual public Person
{
protected:
    void Data();
public:
    PokerPlayer(const char * fn = "null", const char * ln = "null");
    PokerPlayer(const Person & ps);
    void Show();
    void Set();
    int Draw();
};

class BadDude : public Gunslinger, public PokerPlayer
{
protected:
    void Data();
public:
    BadDude(const char * fn = "null", const char * ln = "null", int n = 0);
    BadDude(const Person & ps, int n);
    BadDude(const Gunslinger & gslg);
    //BadDude(const PokerPlayer & pkpl, int n);
    double Gdraw();
    int Cdraw();
    void Show();
    void Set();
};
#endif

//person.cpp
#include "stdafx.h"
#include "person.h"
#include <iostream>
#include <ctime>

using std::cin;
using std::cout;
using std::endl;

//Person methods
void Person::Data() const
{
    cout << "Name: " << firstname << ", " << lastname << endl;
}
void Person::Get()
{
    getline(cin, firstname);
    cout << "Enter lastname: ";
    getline(cin, lastname);
}
Person::Person(const char * fn, const char * ln) :firstname(fn), lastname(ln)
{

}
Person::~Person()
{

}

//Gunslinger methods
void Gunslinger::Data()
{
    cout << "Nick numbers: " << number << endl;
    cout << "time: " << tm << endl;
}
void Gunslinger::Get()
{
    cout << "Enter the number of nicks: ";
    cin >> number;
    cout << "Enter the time: ";
    cin >> tm;
    while (cin.get() != '\n')
        continue;
}
Gunslinger::Gunslinger(int n, const char * fn, const char * ln) :Person(fn, ln), number(n)
{

}
Gunslinger::Gunslinger(int n, const Person & ps) : Person(ps), number(n)
{

}
double Gunslinger::Draw()
{ 
    return tm;
}
void Gunslinger::Show()
{
    cout << "Category : Gunslinger:\n";
    Person::Data();
    Data();
}
void Gunslinger::Set()
{
    cout << "Enter Gunslinger's firstname: ";
    Person::Get();
    Get();
}

//PokerPlayer methods
void PokerPlayer::Data()
{
    cout << "Poker's value: " << Draw() << endl;
} 
PokerPlayer::PokerPlayer(const char * fn, const char * ln) :Person(fn, ln)
{

}
PokerPlayer::PokerPlayer(const Person & ps) : Person(ps)
{

}
void PokerPlayer::Show()
{
    cout << "Category: PokerPlayer:\n";
    Person::Data();
    Data();
}
int PokerPlayer::Draw()
{
    //产生1-52的随机数并返回
    srand(time(0));
    while (1)
    {
        int n = rand() % 53;
        if (n != 0)
        {
            return n;
            break;
        }   
        else
            continue;
    }
}
void PokerPlayer::Set()
{
    cout << "Enter PokerPlayer's firstname: ";
    Person::Get();
}

//BadDude methods
void BadDude::Data()
{
    cout << "time: " << Gdraw() << endl;
    cout << "Poker's value: " << Cdraw() << endl;
}
BadDude::BadDude(const char * fn, const char * ln, int n) :Person(fn, ln), Gunslinger(n, fn, ln)
{

}
BadDude::BadDude(const Person & ps, int n) : Person(ps), Gunslinger(n, ps)
{

}
BadDude::BadDude(const Gunslinger & gslg) : Person(gslg), Gunslinger(gslg)
{

}
/*BadDude::BadDude(const PokerPlayer & pkpl, int n) : Person(pkpl), Gunslinger(pkpl, n)  //为什么woker那个就可以
{

}*/
double BadDude::Gdraw() //为什么随机产生的值总是与Gunslinger的Draw()一样
{
    return Gunslinger::Draw();
}
int BadDude::Cdraw()  //为什么随机产生的值总是与Poker的Draw()一样
{
    return PokerPlayer::Draw();
}
void BadDude::Show()
{
    cout << "Category: BadDude:\n";
    Person::Data();
    Data();
}
void BadDude::Set()
{
    cout << "Enter BadDude's firstname: ";
    Person::Get();
    Gunslinger::Get();
}

//main.cpp
#include "stdafx.h"
#include "person.h"
#include <iostream>
#include <ctime>

const int SIZE = 5;

int main()
{
    using std::cin;
    using std::cout;
    using std::endl;
    using std::strchr;

    Person * lolas[SIZE];

    int ct;
    for (ct = 0; ct < SIZE; ct++)
    {
        char choice;
        cout << "Enter the person category:\n"
            << "g: gunslinger  p:pokerplayer  "
            << "b: bad dude  q: quit\n";
        cin >> choice;
        while (strchr("gpbq", choice) == NULL)
        {
            cout << "Please enter a g, p, b, or q: ";
            while (cin.get() != '\n')
                continue;
            cin >> choice;
        }
        if (choice == 'q')
            break;
        switch (choice)
        {
        case 'g': lolas[ct] = new Gunslinger;
            break;
        case 'p': lolas[ct] = new PokerPlayer;
            break;
        case 'b': lolas[ct] = new BadDude;
            break;
        }
        cin.get();
        lolas[ct]->Set();
    }
    cout << "\nHere is your stuff:\n";
    int i;
    for (i = 0; i < ct; i++)
    {
        cout << endl;
        lolas[i]->Show();
    }
    //怎么用Draw()/GDraw()/CDraw(),现在又不知道每个元素是什么类型......把这些值加到了show()里显示出来
    for (i = 0; i < ct; i++)
        delete lolas[i];
    cout << "Bye.\n";

    std::cin.get();
    clock_t delay = 100 * CLOCKS_PER_SEC;
    clock_t start = clock();
    while (clock() - start < delay)
        ;
    return 0;
}

5.abstr_emp类,多重继承

//emp.h
#ifndef EMP_H_
#define EMP_H_
#include <iostream>
#include <string>
class abstr_emp
{
private:
    std::string fname;
    std::string lname;
    std::string job;
public:
    abstr_emp();
    abstr_emp(const std::string & fn, const std::string ln, const std::string & j);
    virtual void ShowAll() const;  //labels and show all data
    virtual void SetAll();       //prompts user for values
    friend std::ostream & operator<<(std::ostream & os, const abstr_emp & e); //just displays first and last name
    virtual ~abstr_emp() = 0;
};

class employee :public abstr_emp
{
public:
    employee();
    employee(const std::string & fn, const std::string & ln, const std::string & j);
    virtual void ShowAll() const;
    virtual void SetAll();
};

class manager :public virtual abstr_emp
{
private:
    int inchargeof;  //number of abstr_emps managed
protected:
    int InChargeOf() const { return inchargeof; }   //output            //为highfink的ShowAll()和SetAll()不两次调用abstr_emps的函数做准备
    int & InChargeOf() { return inchargeof; }    //input
public:
    manager();
    manager(const std::string & fn, const std::string & ln, const std::string & j, int ico = 0);
    manager(const abstr_emp & e, int ico);
    manager(const manager & m);
    virtual void ShowAll() const;
    virtual void SetAll();
};

class fink :virtual public abstr_emp
{
private:
    std::string reportsto;   //to whom fink reports
protected:
    const std::string ReportsTo() const { return reportsto; }
    std::string & ReportsTo() { return reportsto; }
public:
    fink();
    fink(const std::string & fn, const std::string & ln, const std::string & j, const std::string & rpo);
    fink(const abstr_emp & e, const std::string & rpo);
    fink(const fink & e);
    virtual void ShowAll() const;
    virtual void SetAll();
};

class highfink :public manager, public fink     //managerment fink
{
public:
    highfink();
    highfink(const std::string & fn, const std::string & ln, const std::string & j, const std::string & rpo, int ico);
    highfink(const manager & m, const std::string & rpo);
    highfink(const fink & f, int ico);
    highfink(const highfink & h);
    virtual void ShowAll() const;
    virtual void SetAll();
};
#endif

//emp.cpp
#include "stdafx.h"
#include "emp.h"

using std::cin;
using std::cout;
using std::endl;

//abstr_emp methods
abstr_emp::abstr_emp()
{

}
abstr_emp::abstr_emp(const std::string & fn, const std::string ln, const std::string & j) :fname(fn), lname(ln), job(j)
{

}
void abstr_emp::ShowAll() const   //labels and show all data
{
    cout << "first name: " << fname << endl;
    cout << "last name: " << lname << endl;
    cout << "job: " << job << endl;
}
void abstr_emp::SetAll()    //prompts user for values
{
    getline(cin, fname);
    cout << "Enter the last name: ";
    getline(cin, lname);
    cout << "Enter the job: ";
    getline(cin, job);
}
std::ostream & operator<<(std::ostream & os, const abstr_emp & e)  //just displays first and last name
{
    os << e.fname << ", " << e.lname;
    return os;
}
abstr_emp::~abstr_emp()
{

}

//employee methods
employee::employee() :abstr_emp()
{

}
employee::employee(const std::string & fn, const std::string & ln, const std::string & j) : abstr_emp(fn, ln, j)
{

}
void employee::ShowAll() const
{
    abstr_emp::ShowAll();
}
void employee::SetAll()
{
    abstr_emp::SetAll();
}

//manager methods
manager::manager() :abstr_emp(), inchargeof(0)
{

}
manager::manager(const std::string & fn, const std::string & ln, const std::string & j, int ico) : abstr_emp(fn, ln, j), inchargeof(ico)
{

}
manager::manager(const abstr_emp & e, int ico) : abstr_emp(e), inchargeof(ico)
{

}
manager::manager(const manager & m) : abstr_emp(m)
{
    inchargeof = m.inchargeof;
}
void manager::ShowAll() const
{
    abstr_emp::ShowAll();
    cout << "number of abstr_emps managed: " << inchargeof << endl;
}
void manager::SetAll()
{
    cout << "Enter the manager's first name: ";
    abstr_emp::SetAll();
    cout << "Enter the number of abstr_emps managed: ";
    cin >> inchargeof;
    while (cin.get() != '\n')
        continue;
}

//fink methods
fink::fink() :abstr_emp(), reportsto("null")
{

}
fink::fink(const std::string & fn, const std::string & ln, const std::string & j, const std::string & rpo) : abstr_emp(fn, ln, j), reportsto(rpo)
{

}
fink::fink(const abstr_emp & e, const std::string & rpo) : abstr_emp(e), reportsto(rpo)
{

}
/*fink::fink(const fink & e) : abstr_emp(e)
{
    reportsto = e.reportsto;
}*/
fink::fink(const fink & e) : fink(e)   //复制构造函数到底哪一个对呢
{

}
void fink::ShowAll() const
{
    abstr_emp::ShowAll();
    cout << "to whom fink reports to: " << reportsto << endl;
}
void fink::SetAll()
{
    cout << "Enter the fink's first name: ";
    abstr_emp::SetAll();
    cout << "Enter the person fink reports to: ";
    getline(cin, reportsto);
}

//highfink methods
highfink::highfink() :abstr_emp(), manager(), fink()
{

}
highfink::highfink(const std::string & fn, const std::string & ln, const std::string & j,
    const std::string & rpo, int ico) : abstr_emp(fn, ln, j), manager(fn, ln, j, ico), fink(fn, ln, j, rpo)
{

}
highfink::highfink(const manager & m, const std::string & rpo) : abstr_emp(m), fink(m, rpo)
{

}
highfink::highfink(const fink & f, int ico) : abstr_emp(f), manager(f, ico)
{

}
highfink::highfink(const highfink & h) : highfink(h)
{

}
void highfink::ShowAll() const
{
    abstr_emp::ShowAll();
    cout << "number of abstr_emps managed: " << manager::InChargeOf() << endl;
    cout << "to whom fink reports to: " << fink::ReportsTo() << endl;
}
void highfink::SetAll()
{
    cout << "Enter the highfink's first name: ";
    abstr_emp::SetAll();
    cout << "Enter the number of abstr_emps managed: ";
    cin >> manager::InChargeOf();
    while (cin.get() != '\n')
        continue;
    cout << "Enter the person highfink reports to: ";
    getline(cin, fink::ReportsTo());
}

//main.cpp
#include "stdafx.h"
#include "emp.h"
#include <ctime>

using namespace std;

int main()
{
    employee em("Trip", "Harris", "Thumper");
    cout << em << endl;
    em.ShowAll();
    cout << endl;
    manager ma("Amorphia", "Spindragon", "Nuancer", 5);
    cout << ma << endl;
    ma.ShowAll();
    cout << endl;

    fink fi("Matt", "Oggs", "Oiler", "Juno Barr");
    cout << fi << endl;
    fi.ShowAll();
    cout << endl;
    highfink hf(ma, "Curly Kew");
    hf.ShowAll();
    cout << endl;
    cout << "Press a key for next phase:\n";
    cin.get();
    while (cin.get() != '\n')
        continue;
    highfink hf2;
    hf2.SetAll();

    cout << "Using an abstr_emp * pointer:\n";
    abstr_emp * tri[4] = { &em, &fi, &hf, &hf2 };  //只能用指针
    for (int i = 0; i < 4; i++)
    {
        tri[i]->ShowAll();
        cout << endl;
    }

    /*abstr_emp tri[4] = { em, fi, hf, hf2 };  //abstr_emp为抽象类,不能具体化
    for (int i = 0; i < 4; i++)
    {
    tri[i].ShowAll();
    cout << endl;
    }*/

    clock_t delay = 100 * CLOCKS_PER_SEC;
    clock_t start = clock();
    while (clock() - start < delay)
        ;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值