检查类是否具有预期属性

时间:2015-07-24 00:23:14

标签: c++ unit-testing data-structures attributes

我将提供一些关于C ++和数据结构的课程,并检查学生和#39;进步我希望他们能够发展我所谈论的结构。我猜这是数据结构类的常用方法。但是我想要更多,我希望学生能够快速反馈他们缺少的东西,所以我为那些检查行为的类开发了几个单元测试,并给出了错误的即时结果。

这在过去两个学期一直运作正常,但我希望在自动化校正方面更进一步。我一直在研究如何检查课程的内部组件,因此我可以知道某人是否正确实施了node* rootsize_t size并且未使用过的树例如,其他不必要的属性。

我知道我可以使用sizeof粗略估计对象大小,但结果并不精确。它经常与我的期望不同,例如:我测试了创建一个带有指针(8个字节)和一个int(4个字节)的类,但是sizeof是28.从我学到的,可能这有与虚函数表和其他对齐的东西有关。

那么,如果有人以正确和预期的方式编码数据结构,我还能走多远呢?我如何检查某人是否#include <list>并且创建了一个适配器(为此我知道我可以删除包含但是无论如何)?

1 个答案:

答案 0 :(得分:0)

让我们将这个答案分成两部分,我们将在is_standard_layout的回复中分开。

1。虚拟课程

is_standard_layout将返回false,表示该类为virtual。除了virtual函数指针之外,virtual类将包含父母的所有成员。您可以找到更多信息here。基本上,在这里查找成员数量的最佳选择是sizeof所讨论的课程减少sizeof(void*)并且大小与virtual class&#39相同;成员。

2。非虚拟课程

is_standard_layout将返回true,这意味着这不是virtual class。在这种情况下,我们可以使用offsetof来查找头信息之后的第一个成员变量。使用指向对象的指针和sizeof查找对象的结尾,您将测量到offsetof返回的点的距离。

这两种方法都应该产生类中成员的大小。确定班级规模的允许范围是优先考虑的问题。但是将评估放在static_assert中将允许您提供一个编译时间消息,指出断言的原因。