【问题标题】:No default constructor?没有默认构造函数?
【发布时间】:2016-07-18 23:40:49
【问题描述】:
#include <iostream>
using namespace std;

//To know the car's make, model, color, license number, and the number of minutes the car has been parked
class ParkedCar
{
    string make, model, color, license_number;
    int minutes;
public:
    ParkedCar(string make = "...", string model = "...", string color = "...",
        string license_number = "...", int minutes = 0) : make{ make }, model{model},
        color{color}, license_number{license_number}, minutes{minutes} { this->make = make; }
};

//To know the number of minutes of parking time that has been purchased
class ParkingMeter
{
    int purchased_minutes;
public:
    ParkingMeter(int purchased_minutes) { this->purchased_minutes = purchased_minutes; }
};

//To report the make, model, color, and license number of the illegally parked car
//To report the amount of the fine, which is $25 for the first hour, or part of an
    //hour that the car is illegally parked, plus $10 for every additional hour or
    //part of an hour that the car is illegally parked
//To report the name and badge number of the police officer issuing the ticket
class ParkingTicket
{
    ParkedCar car;
    ParkingMeter meter;
    PoliceOfficer officer;
public:
    ParkingTicket(const ParkedCar &car, const ParkingMeter &meter, const PoliceOfficer &officer)
    {
        this->car = car;
        this->meter = meter;
        this->officer = officer;
    }
};

//To know the officer's name and badge number
//To examine a ParkedCar object and a ParkingMeter object, and determine whether the car's time has expired
//To issue a prking ticket (generate a ParkingTicket object) if the car's time has expired
class PoliceOfficer
{
    string name;
    int badge_number;
    ParkedCar car;
    ParkingMeter meter;
public:
    PoliceOfficer(const ParkedCar &car, const ParkingMeter &meter, string name = "...", int badge_number = 000000)
    {

        this->car = car;
        this->meter = meter;
    }

};

所以我正在为学校制作这个文件,一切都很顺利,直到我上 ParkingTicket 和 PoliceOfficer 课程。我正在尝试定义这些构造函数,它们都告诉我另一个类没有默认构造函数。我将如何解决这个问题?谢谢! :)

【问题讨论】:

  • “我该如何解决这个问题?” 提供默认构造函数,不带参数,或者将它们全部设置为默认值。
  • ParkedCar 和 ParkingMeter 真的是警官的成员吗?警官真的由姓名、徽章、汽车和仪表组成吗?
  • 是的,ParkedCarParkingMeter 真的警察的成员。名称和徽章是特定于 PoliceOfficer 的属性,而我使用从构造函数接收的 carmeter 对象的类内副本来获取它们的值和函数 [我将稍后制作] 用于警察能够报告否则无法获得的信息。

标签: c++ constructor not-exists


【解决方案1】:

因为你的构造函数

PoliceOfficer(const ParkedCar &car, const ParkingMeter &meter, string name = "...", int badge_number = 000000)
{

    this->car = car;
    this->meter = meter;
}

没有 carmeter 的成员初始化程序(主体中的赋值不算作初始化程序),就好像您编写了 : car(), meter() 初始化程序,它试图调用没有的默认构造函数不存在。您应该显式编写成员初始化器:

PoliceOfficer(const ParkedCar &car, const ParkingMeter &meter, string name = "...", int badge_number = 000000)
    : car(car), meter(meter)
{
}

(另外,你的对象模型有点搞笑:警察只有一个停车计时器?)

【讨论】:

  • 是的,在我使用的情况下,该官员将只有一个停车计时器,以及一辆停放的汽车和一张停车票。我可以稍后修改程序以拥有ParkingMeter 对象的数组。另外,感谢您的帮助!它现在只有 6 个错误! :)
【解决方案2】:

首先,ParkedCar(如您所见)确实有一个默认构造函数(所有参数都有默认值,因此可以不带参数调用它。

真正的解决方案是改变构造函数使用初始化列表:

   PoliceOfficer(const ParkedCar &car_, const ParkingMeter &meter_, string name = "...", int badge_number = 000000)
   : car(car_), meter(meter_)
   {
   }

【讨论】:

  • 很抱歉,您使用car(car_)meter(meter_) 的方式与前面提到的@aschepler 相同,使用car(car)meter(meter) 点, 分别。参数名称可以与类属性相同,即使是类对象也可以,因为参数名称什么都不做,但感谢您的回复! :)
  • 他在我输入我的答案时提交了他的答案。在我提交之前我没有看到他的回复(但我们都提出了同样的建议并不奇怪 - 它“正确”的答案)。我宁愿避免为不同的事物使用相同的名称——这可能是合法的,但我觉得它令人困惑。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 2015-06-02
  • 2017-10-04
  • 2022-01-01
相关资源
最近更新 更多