1

我目前正在为学校开展一个大型项目,该项目分为 6 个里程碑。在第一个里程碑中,我获得了要添加到我的文件中的代码,但我不知道如何对它们进行分类。在模块化编程中分发代码的一般约定是什么?

这是我得到的:

里程碑 1:日期类

要启动此项目,请从课程存储库中克隆/下载里程碑 1,并对 Date 类的缺失部分进行编码。

Date 类封装了一个可由 an 读取std::istream并可由 an 打印的日期,std::ostream使用以下格式进行读取和写入:YYYY/MM/DD,其中 YYYY 表示年份的四位数值,MM 表示两位月份的数字值,DD 是指月份中日期的两位数。

Date使用以下规范完成类的实现:

预定义常量:

预先定义被认为可以接受的年份限制:

const int min_year = 2000 const int max_year = 2030

私人会员:

数据:

年份 – min_year 和 max_year 之间的四位整数

一年中的月份——介于 1 和 12 之间的值(包括 1 到 12)

月份中的某一天 - 介于 1 和月份中的天数之间的值(请参阅

mday(int,int)成员函数如下所述)——请注意,闰年二月有 29 天。

用于比较存储在当前对象中的日期与存储在另一个 Date 对象中的日期的比较器值。您的构造函数设置此值,您的公共操作员使用它来比较两个日期。(如果日期一的值大于日期二的值,则日期一比日期二更近;即日期一在日期二之后)。

客户端可以参考的错误状态,以确定对象是否包含有效日期,如果不是,则日期的哪一部分出错。可能的错误状态是在 Date 类标头中定义为宏的整数值:

NO_ERROR 0-- 无错误 - 日期有效

CIN_FAILED 1-- istream 信息输入失败

YEAR_ERROR 2-- 年份值无效

MON_ERROR 3-- 月份值无效

DAY_ERROR 4-- 日值无效

成员函数:

int mdays(int month, int year) const;(这个查询已经实现并提供)。此查询返回 中的天monthyear

void errCode(int errorCode); 此函数将错误状态变量设置为上面列出的值之一。

公众成员:

构造函数:

无参数(默认)构造函数:将对象初始化为安全的空状态并将错误状态设置为NO_ERROR. 使用 0000/00/00 作为安全空状态的日期,并将比较器值设置为 0。

三参数构造函数:在其参数中接受年、月和日的整数值。此构造函数检查每个数字是否在范围内,按年、月和日的顺序排列。如果任何数字不在范围内,此函数将错误状态设置为适当的错误代码并停止进一步验证。

(使用 mday(int,int) 成员函数获取接收年份的接收月份中的天数。月份值可以介于 1 和 12 之间)。如果接收到的所有数据都有效,则此构造函数将接收到的值存储在当前对象中,计算比较器值,并将错误状态设置为 NO_ERROR。如果接收到的任何数据无效,则此构造函数将对象初始化为安全的空状态,将比较器值设置为 0,并将错误状态设置为 NO_ERROR。

使用以下公式设置有效日期的比较器值:= 年 * 372 + 月 * 13 + 日

运营商

bool operator==(const Date& rhs) const;

bool operator!=(const Date& rhs) const;

bool operator<(const Date& rhs) const;

bool operator>(const Date& rhs) const;

bool operator<=(const Date& rhs) const;

bool operator>=(const Date& rhs) const;

如果两个对象不为空,则这些比较运算符返回将当前对象作为左侧操作数与另一个 Date 对象作为右侧操作数进行比较的结果。如果其中一个或两个为空,则这些运算符返回 false。

例如,如果存储在当前对象中的日期早于存储在 rhs 中的日期,则 operator< 返回 true;否则,此运算符返回 false。

查询和修饰符

int errCode() const; 此查询将错误状态作为错误代码值返回。

bool bad() const; 如果错误状态不是 NO_ERROR,则此查询返回 true。

std::istream& read(std::istream& istr); 此函数以以下格式从控制台读取日期:YYYY?MM?DD(例如 2016/03/24 或 2016-03-24)。该功能不提示用户。如果 istr 在任何时候失败,此函数将错误状态设置为 CIN_FAILED 并且不清除 istr。如果 istr 失败,对 istr.fail() 的调用返回 true。如果您的 read() 函数成功读取数字,则无论此输入过程的结果如何,此函数都会返回对 std::istream 对象的引用。

std::ostream& write(std::ostream& ostr) const; 此查询以下列格式将日期写入 std::ostream 对象:YYYY/MM/DD,然后返回对 std::ostream 对象的引用。辅助函数:operator<< 此运算符与 std::ostream 对象一起使用以将日期打印到控制台。运算符>> 此运算符与 std::istream 对象一起从控制台读取日期。在这些运算符中使用 read 和 write 成员函数;不要为这些运算符重载使用朋友。在头文件中包含这两个运算符的原型。将它们的原型放在类定义之后。

4

1 回答 1

1

我不确定你的目标是什么。但通常的做法是将您的项目划分为子项目目录。然后将header(.h, .hpp etc)source(.c, .cpp, .cxx etc)文件分开。以单一职责原则激励部门

于 2018-03-13T15:57:21.287 回答