使一个类生成另一个类?

时间:2013-11-23 23:47:50

标签: c++ class inheritance

好的,所以我有一个课程的作业,要求我们一起使用一系列课程,以模拟一个发票的警察。

以下是它的工作原理:

ParkedCar类:

了解汽车的品牌,型号,颜色,许可证编号和分钟数 汽车已经停放了

ParkingMeter类:

知道已经购买了多少时间

ParkingTicket Class:

了解汽车的品牌,型号,颜色,许可证,计算罚款,以及签发机票的人员的姓名和证件编号

PoliceOfficer Class:

知道官员的徽章编号

检查ParkedCar和ParkingMeter对象并确定是否需要票证,如果是,则生成ParkingTicket对象。

这是我到目前为止的代码:

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<ctime>

using namespace std;

class ParkedCar
{
    string sMake;
    string sModel;
    string sColor;
    string sPlate;
    int iMinsParked;

    public:

    ParkedCar();

    string getMake() const
    { return sMake; }

    void setMake(string temp)
    { sMake = temp; }

    string getModel() const
    { return sModel; }

    void setModel(string temp)
    { sModel = temp; }

    string getColor() const
    { return sColor; }  

    void setColor(string temp)
    { sColor = temp; }

    string getPlate() const
    { return sPlate; }

    void setPlate(string temp)
    { sPlate = temp; }

    int getMins() const
    { return iMinsParked; }

};

ParkedCar::ParkedCar()
{


    srand(time(NULL));

    iMinsParked = (rand() % 10000); 
}

class ParkingMeter
{
    int iMinsPurch;

    public:

    void setMins(int temp)
    { iMinsPurch = temp; }

    int getMins() const
    { return iMinsPurch; }
}

class Ticket : public ParkedCar
{

    public:

    string getName()
    { return sName; }

    int getBadge()
    { return iBadge; }
};

class Officer
{
    string sName;
    int iBadge;

    public:

    friend string Ticket::getName();
    //{ return sName; }

    friend int Ticket::getBadge();
    //{ return iBadge; }
};

int main()
{
    ParkedCar Park;

    cout << endl << endl;

    cout << Park.getMins();

    cout << endl << endl;
    return 0;
}

我很困惑的地方主要是票务和官员课程。该任务显然希望Ticket拥有来自所有其他课程的自己的信息,但我不确定如何传递这些信息。我试过让它成为ParkedCar的子类,但我只是得到了一个多重定义错误。我无法让朋友的功能发挥作用。我已经尝试过两种方式,如果我在Ticket中制作它们,它会告诉我官员没有定义。而且我真的很困惑我应该如何在没有实际初始化时生成Ticket实例的官员编写代码。

所以:

  1. 如何将所有信息输入Ticket类?

  2. 我如何让官员生成故障单的实例?

  3. 请记住,这是一项学生作业,而不是专业作业。我只是想做任务所说的。我对这个问题的“解决方法”并不感兴趣,因为那不是教授想要的。

    提前感谢您的时间。 :d

1 个答案:

答案 0 :(得分:2)

首先:学习使用构造函数。所有这些你正在设置的东西......它是汽车或警察等身份的组成部分。它应该在物体建造时提供。 C ++不是Java;退出像Java bean这样的处理类。 :P

其次,Ticket不是ParkedCar。它与汽车联系起来,但不是一辆汽车。请考虑一下:

class Ticket {
    ParkedCar violator;
    Officer issuer;
  public:
    Ticket(const Officer &cop, const ParkedCar &car) :
        violator(car), issuer(cop) {
    }

    ParkedCar getCar() { return violator; }
    Officer getOfficer() { return issuer; }

    // Note, no mutators here!
    // The biggest reason you had to have mutators, is that your construction
    // was incomplete.
    // The info associated with a Ticket should not be modified once the ticket
    // is written. And since the constructor has all the info needed, there's no
    // need to provide a way to modify them.
};

因此,警官无需了解汽车的潜在复杂细节,也不需要知道机票所需的确切信息。他可以将自己和汽车交给构造函数,并相信它会提取所需的任何信息。 (在这种情况下,我们只存储两个项目的副本。)

class Officer {
    std::string name;
    int badge_number;

  public:
    Officer(const std::string& name, int badge) : name(name), badge_number(badge) { }

    public std::string getName() { return name; }
    public int getBadgeNumber() { return badge_number; }

    Ticket writeTicketFor(const ParkedCar &violator) {
       return Ticket(*this, violator);
    }
};