Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:初始化派生和基的正确格式_C++_Inheritance_Initialization - Fatal编程技术网

C++ C++;:初始化派生和基的正确格式

C++ C++;:初始化派生和基的正确格式,c++,inheritance,initialization,C++,Inheritance,Initialization,我制作了一个日期类,可以容纳月份、日期和年份。但现在我有一个问题。 我使用了这个带有继承的日期类来存储例如person的Ctor(实际上在person的初始化列表中使用了date类的Ctor)为person(接待员、乘客等)(一家酒店)存储的dateOfBirth,但是现在我不知道我主要应该使用什么格式来初始化person?!不管怎样,总的来说我能直接做吗?对不起,我是初学者。谢谢你的帮助。 以下是我代码的一些部分: class date { int month = 1; vec

我制作了一个日期类,可以容纳月份、日期和年份。但现在我有一个问题。 我使用了这个带有继承的日期类来存储例如person的Ctor(实际上在person的初始化列表中使用了date类的Ctor)为person(接待员、乘客等)(一家酒店)存储的dateOfBirth,但是现在我不知道我主要应该使用什么格式来初始化person?!不管怎样,总的来说我能直接做吗?对不起,我是初学者。谢谢你的帮助。 以下是我代码的一些部分:

class date {
    int month = 1;
    vector<int>month_days{ 31,31,31,31,31,31,30,30,30,30,30,29 };
    int day = 1;
    int year = 1300;

//---------------------member functions:
public:
    date(int m = 1, int d = 1, int y = 1300) {
        if (m>0 && m <= 31) month = m;
        if (d>0 && d <= 31) day = d;
        if (y>0 && y <= 3000) year = y;
    }
//some other code...
};

class person:public date {
protected:
    string m_name;
    string m_familyName;
    string m_idNumber;
//---------------------member functions:
public:
    person(string name, string familyName, string idNumber, date dateOfBirth) 
        : m_name(name),m_familyName(familyName),m_idNumber(idNumber),date(dateOfBirth)
    {
}
//some other code...
};
我检查了对象“a”的存储日期,它的日期返回111300,然而,我不知道什么也可以完成这项工作。
(顺便说一句,我定义日期的原因是与person分开的,因为我重载了操作符-在其中计算乘客的停留时间)

您需要做的就是将括号改为大括号(这是为了编译代码,而不是为了设计良好,也不是为了生成警告):

-

带括号的版本等效于(逗号运算符):


在为参数提供默认值之前,我会三思而后行。你可能不需要它们。

主题之外,
person
不是一个
date
person
应该有一个
date
。我认为你想要的是将
date
作为
person
类的属性,而不是使用继承。一个人可以拥有日期的哪些属性或功能?出生日期显然就是日期。这并不意味着一个人就是一个日期。@M-J你不能用这种方式在person构造函数上复制dateOfbirth,你可以一个成员一个成员地复制。这是由于糟糕的设计,因为一个人不是date@M-出生日期-一个
person
的数据成员。同时在
日期
构造函数中忽略范围错误可能不是最好的主意。
1998
被吞没了,因为它不是一个月的有效值,这进一步增加了调试问题时的混乱。@LogicStuff我以为默认构造函数没有用处,我不需要一个没有信息的人。这是一个愚蠢的理由吗!?(当一个新手试图诚实时就会发生这种情况8))@M-J你是对的,我假设你的
日期必须是默认可构造的(例如,为了新纪元的开始),作为某种变通方法的一部分。@LogicStuff一个附属问题:我已经更正了我的设计,我是否应该更改问题中的代码以避免混淆可能的过路人?或者我应该让它保持原样?我只是不太熟悉这方面的惯例。非常感谢您的帮助。@M-J我不会这么做,因为这已经在评论中讨论过了,并且会使这些引用无效。或者它需要删除我答案中的最后两句话,以及大量标记为过时的评论——阅读时你也应该这样做,并删除最近的评论。
person a("Michael", "Deoran", "05174084", (4,17,1998));
person a("Michael", "Deoran", "05174084", {4, 17, 1998});
person a("Michael", "Deoran", "05174084", 1998);