在C ++模块化编程中,如何组装.cpp和.h文件?

时间:2018-03-13 15:47:05

标签: c++ modular-design

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

这就是我所得到的:

里程碑1:日期类

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

Date类封装了std::istream可读的日期,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和本月天数之间的值(请参阅

mday(int,int)成员函数如下所述) - 请注意,2月份有29个 闰年的日子。

比较器值,用于将存储在当前对象中的日期与存储在另一个Date对象中的日期进行比较。您的构造函数设置此值,您的公共运算符使用它来比较两个日期。 (如果日期1的值大于日期2的值,则日期1比日期2更新;即,日期1是在日期2之后。)

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

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

CIN_FAILED 1 - istream信息输入失败

YEAR_ERROR 2 - 年份值无效

MON_ERROR 3 - 月值无效

DAY_ERROR 4 - 日期值无效

会员功能:

int mdays(int month, int year) const;(此查询已经存在 实施和提供)。此查询返回month的{​​{1}}天数。

year 此函数将错误状态变量设置为上面列出的值之一。

公开会员:

构造

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

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

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

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

NO_ERROR

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。

例如运算符&lt;如果存储在当前对象中的Date在rhs中存储的日期之前,则返回true;否则,此运算符返回false。

查询和修饰符

bool operator>=(const Date& rhs) const; 此查询将错误状态作为错误代码值返回。

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

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

std::istream& read(std::istream& istr); 此查询以下列格式将日期写入std :: ostream对象:YYYY / MM / DD,然后返回对std :: ostream对象的引用。 辅助函数:运算符&lt;&lt;此运算符使用std :: ostream对象将日期打印到控制台。运营商GT;&GT;此运算符使用std :: istream对象从控制台读取日期。在这些运算符中使用读写成员函数;请勿使用朋友进行操作员重载。在头文件中包含这两个运算符的原型。将它们的原型放在类定义之后。

1 个答案:

答案 0 :(得分:1)

我不确定你的目标是什么。但通常的做法是将项目划分为子项目目录。然后将header(.h, .hpp etc)source(.c, .cpp, .cxx etc)文件分开。通过documentation

进行激励