在 C++ 模块化编程中,如何 assemble .cpp 和 .h 文件?
In C++ modular programming, how do you assemble the .cpp and .h files?
我目前正在为学校开展一个大型项目,该项目分为 6 个里程碑。在第一个里程碑中,我得到了要添加到我的文件中的代码,但我不知道如何对它们进行分类。在模块化编程中分发代码的一般约定是什么?
这是我得到的:
里程碑 1:日期 CLASS
为了 kick-start 这个项目,课程库中的 clone/download 里程碑 1 并对日期 class 的缺失部分进行编码。
日期 class 封装了一个 std::istream
可读且 std::ostream
可打印的日期,使用以下格式进行读写:YYYY/MM/DD,其中 YYYY 指的是年份的 four-digit 值,MM 指的是月份的 two-digit 值,DD 指的是月份中的日期的 two-digit 值。
使用以下规范完成 Date
class 的实施:
Pre-defined 常数:
Pre-define 可接受的年份限制:
const int min_year = 2000
const int max_year = 2030
私人会员:
数据:
年份 – min_year 和 max_year
之间的四位整数
一年中的月份 - 介于 1 和 12 之间的值(含 1 和 12)
一个月中的第几天 – 一个介于 1 和该月天数之间的值(请参阅
mday(int,int)
下面介绍的成员函数)——注意February有29个
闰年的天数。
用于比较存储在当前 object 中的日期与存储在另一个日期 object 中的日期的比较器值。您的构造函数设置此值,您的 public 运算符使用它来比较两个日期。 (如果日期一的值大于日期二的值,则日期一比日期二最近,即日期一晚于日期二)。
客户端可以参考的错误状态,以确定 object 是否包含有效日期,如果不是,则日期的哪一部分有误。可能的错误状态是在 Date class header:
中定义为宏的整数值
NO_ERROR 0
-- 没有错误 - 日期有效
CIN_FAILED 1
-- istream 信息输入失败
YEAR_ERROR 2
-- 年份值无效
MON_ERROR 3
-- 月份值无效
DAY_ERROR 4
-- 日期值无效
成员函数:
int mdays(int month, int year) const;
(这个查询已经
实施和提供)。此查询 returns year
的 month
中的天数。
void errCode(int errorCode);
此函数将错误状态变量设置为上面列出的值之一。
Public 成员:
构造函数:
无参数(默认)构造函数:将 object 初始化为安全的空状态,并将错误状态设置为 NO_ERROR
。使用 0000/00/00 作为安全空状态的日期并将比较器值设置为 0。
三参数构造函数:在其参数中接受年月日的整数值。此构造函数检查每个数字是否在范围内,按年、月和日的顺序。如果任何数字不在范围内,此函数将错误状态设置为适当的错误代码并停止进一步验证。
(使用mday(int,int)成员函数获取接收年份的接收月份的天数,月份值可以在1到12之间(含))。如果接收到的所有数据都有效,则此构造函数将接收到的值存储在当前 object 中,计算比较器值,并将错误状态设置为 NO_ERROR。如果收到的任何数据无效,这
构造函数将 object 初始化为安全的空状态,将比较器值设置为 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;
这些比较运算符 return 将当前 object 作为 left-hand 副操作数与另一个 Date object 作为 right-hand 副操作数进行比较的结果如果两个 object 不为空。如果其中一个或两个为空,则这些运算符 return false.
例如 operator< returns 如果存储在当前 object 中的日期早于存储在 rhs 中的日期,则为真;否则,此运算符 returns false.
查询和修饰符
int errCode() const;
此查询 return 将错误状态作为错误代码值。
bool bad() const;
如果错误状态不是 NO_ERROR.
,则此查询 return 为真
std::istream& read(std::istream& istr);
此函数以以下格式从控制台读取日期:YYYY?MM?DD(例如 2016/03/24 或 2016-03-24)。此功能不提示用户。如果 istr 在任何时候失败,此函数将错误状态设置为 CIN_FAILED 并且不清除 istr。如果 istr 失败,则调用istr.fail() return 正确。如果您的 read() 函数成功读取数字,无论此输入过程的结果如何,此函数 return 都是对 std::istream object.
的引用
std::ostream& write(std::ostream& ostr) const;
此查询将日期写入 std::ostream object,格式如下:YYYY/MM/DD,然后 return 引用 std::ostream object。
辅助函数:operator<< 该运算符与 std::ostream object 一起工作,将日期打印到控制台。 operator>> 此运算符与 std::istream object 一起从控制台读取日期。在这些操作符中使用读写成员函数;不要对这些运算符重载使用友元。在 header 文件中包含这两个运算符的原型。将他们的原型放在 class 定义之后。
我不确定你的目标是什么。但是通常的做法是将您的项目划分为子项目目录。然后将 header(.h, .hpp etc)
和 source(.c, .cpp, .cxx etc)
文件分开。以 Single Responsibility Principle
进行激励
我目前正在为学校开展一个大型项目,该项目分为 6 个里程碑。在第一个里程碑中,我得到了要添加到我的文件中的代码,但我不知道如何对它们进行分类。在模块化编程中分发代码的一般约定是什么?
这是我得到的:
里程碑 1:日期 CLASS
为了 kick-start 这个项目,课程库中的 clone/download 里程碑 1 并对日期 class 的缺失部分进行编码。
日期 class 封装了一个 std::istream
可读且 std::ostream
可打印的日期,使用以下格式进行读写:YYYY/MM/DD,其中 YYYY 指的是年份的 four-digit 值,MM 指的是月份的 two-digit 值,DD 指的是月份中的日期的 two-digit 值。
使用以下规范完成 Date
class 的实施:
Pre-defined 常数:
Pre-define 可接受的年份限制:
const int min_year = 2000
const int max_year = 2030
私人会员:
数据:
年份 – min_year 和 max_year
之间的四位整数一年中的月份 - 介于 1 和 12 之间的值(含 1 和 12)
一个月中的第几天 – 一个介于 1 和该月天数之间的值(请参阅
mday(int,int)
下面介绍的成员函数)——注意February有29个
闰年的天数。
用于比较存储在当前 object 中的日期与存储在另一个日期 object 中的日期的比较器值。您的构造函数设置此值,您的 public 运算符使用它来比较两个日期。 (如果日期一的值大于日期二的值,则日期一比日期二最近,即日期一晚于日期二)。
客户端可以参考的错误状态,以确定 object 是否包含有效日期,如果不是,则日期的哪一部分有误。可能的错误状态是在 Date class header:
中定义为宏的整数值NO_ERROR 0
-- 没有错误 - 日期有效
CIN_FAILED 1
-- istream 信息输入失败
YEAR_ERROR 2
-- 年份值无效
MON_ERROR 3
-- 月份值无效
DAY_ERROR 4
-- 日期值无效
成员函数:
int mdays(int month, int year) const;
(这个查询已经
实施和提供)。此查询 returns year
的 month
中的天数。
void errCode(int errorCode);
此函数将错误状态变量设置为上面列出的值之一。
Public 成员:
构造函数:
无参数(默认)构造函数:将 object 初始化为安全的空状态,并将错误状态设置为 NO_ERROR
。使用 0000/00/00 作为安全空状态的日期并将比较器值设置为 0。
三参数构造函数:在其参数中接受年月日的整数值。此构造函数检查每个数字是否在范围内,按年、月和日的顺序。如果任何数字不在范围内,此函数将错误状态设置为适当的错误代码并停止进一步验证。
(使用mday(int,int)成员函数获取接收年份的接收月份的天数,月份值可以在1到12之间(含))。如果接收到的所有数据都有效,则此构造函数将接收到的值存储在当前 object 中,计算比较器值,并将错误状态设置为 NO_ERROR。如果收到的任何数据无效,这 构造函数将 object 初始化为安全的空状态,将比较器值设置为 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;
这些比较运算符 return 将当前 object 作为 left-hand 副操作数与另一个 Date object 作为 right-hand 副操作数进行比较的结果如果两个 object 不为空。如果其中一个或两个为空,则这些运算符 return false.
例如 operator< returns 如果存储在当前 object 中的日期早于存储在 rhs 中的日期,则为真;否则,此运算符 returns false.
查询和修饰符
int errCode() const;
此查询 return 将错误状态作为错误代码值。
bool bad() const;
如果错误状态不是 NO_ERROR.
std::istream& read(std::istream& istr);
此函数以以下格式从控制台读取日期:YYYY?MM?DD(例如 2016/03/24 或 2016-03-24)。此功能不提示用户。如果 istr 在任何时候失败,此函数将错误状态设置为 CIN_FAILED 并且不清除 istr。如果 istr 失败,则调用istr.fail() return 正确。如果您的 read() 函数成功读取数字,无论此输入过程的结果如何,此函数 return 都是对 std::istream object.
std::ostream& write(std::ostream& ostr) const;
此查询将日期写入 std::ostream object,格式如下:YYYY/MM/DD,然后 return 引用 std::ostream object。
辅助函数:operator<< 该运算符与 std::ostream object 一起工作,将日期打印到控制台。 operator>> 此运算符与 std::istream object 一起从控制台读取日期。在这些操作符中使用读写成员函数;不要对这些运算符重载使用友元。在 header 文件中包含这两个运算符的原型。将他们的原型放在 class 定义之后。
我不确定你的目标是什么。但是通常的做法是将您的项目划分为子项目目录。然后将 header(.h, .hpp etc)
和 source(.c, .cpp, .cxx etc)
文件分开。以 Single Responsibility Principle