【问题标题】:Making a class generate another class?让一个类生成另一个类?
【发布时间】:2013-11-23 23:47:50
【问题描述】:

好的,所以我有一个班级作业,要求我们一起使用一系列班级,以模拟警察开罚单。

它是这样工作的:

ParkedCar 类:

了解汽车的品牌、型号、颜色、车牌号和分钟数 车已经停好

ParkingMeter 类:

知道已经购买了多少时间

停车票类:

了解汽车的品牌、型号、颜色、牌照,计算罚款,以及开票人员的姓名和徽章编号

警官类:

知道军官的名字一个徽章编号

检查 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. 如何让警官生成票证实例?

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

提前感谢您的宝贵时间。 :D

【问题讨论】:

  • 对于Officer要生成Ticket的实例,他只需要一个返回类型为Ticket的方法。而不是intstringvoid,将返回类型标记为Ticket,让方法构建并返回一个Ticket对象。

标签: c++ class inheritance


【解决方案1】:

首先:学习使用构造函数。您正在设置的所有这些东西......它是汽车或警察等身份的组成部分。它应该在构建对象时提供。 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.
};

因此,警官不需要了解汽车的潜在复杂细节,或者 Ticket 需要哪些信息。他可以将自己和汽车交给构造器,并相信它会提取所需的任何信息。 (在这种情况下,我们只存储这两个项目的副本。)

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

【讨论】:

  • 嗯,教授希望用户输入所有汽车信息,所以我不能将所有这些整齐地打包到构造函数中,这就是为什么我有这么多突变体的原因。但是我仍然不太明白如何实现您的代码....无论我做什么类,我都在声明一个尚未定义的类的实例。此外,由于汽车信息必须由用户定义,我不明白如何在初始化任何数据之前将其传递给 Ticket。
  • 汽车已经存在。如果没有,警察就不会知道它是非法停放的,也不会写罚单。 :P 就汽车的用户输入而言,获取输入然后构建汽车。
  • 循环是一个小问题。但是可以通过在Officer 类的头文件中说class Ticket; class ParkedCar; 来解决它。 C++ 允许您在函数声明中使用不完整的类型,并且官员不需要包含任何一种类型的对象,因此一旦将代码移出到自己的 .cpp 文件中,一切都应该很好。 (在 .cpp 文件中,您将包含这些类的标头。)
  • 老实说,我不知道您的代码应该如何工作。 :C 我们最近才了解到使用朋友声明在类之间传递信息。在这里你告诉我把整个类交给构造函数?我完全不知道如何正确地做到这一点,或者你的代码中的 20 个函数中的任何其他函数应该是什么。我只需要一个简单的、防伪的方法来做到这一点。 XD
  • 好的,我看到了在Officer 创建Ticket 时使用构造函数是如何有意义的。但我不明白我应该如何在不使用所有这些访问器的情况下将所有其他类的数据传递给 Ticket。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多