所有问候,
可以在C中制作一个未来安全的比较运算符(==)吗?
我遇到的问题是我们有一个有多个成员的课程.我们有一个比较运算符来验证对象的instance-1是否与instance-2具有相同的值.
即我们可以做
class blarg { ..... }; ..... blarg b1(..initializers...); blarg b2 = b1; if (b1 == b2) { ... then do something .... }
但是,我有一个同事向类添加了一个新成员,但是没有更新比较运算符.这导致了我们花了一些时间弄清楚的问题.
是否有编码实践,我的意思是代码审查(对我们来说失败),或编码方法,设计,模板,魔术豆,无论如何可以帮助避免这样的情况?
我的第一个反应是使用memcmp命令.但是,在读取“Comparing structures in C vs C++”的堆栈溢出条目后,我看到这可能是有问题的,因为C类不仅仅包含成员数据.
其他人如何处理?
预先感谢您的帮助.
解决方法
那么明显的解决办法是当你扩展原来的班级时要更加小心. :)“更加小心”包括代码评论,像这样的东西,但显然这不是愚蠢的证明.
因此,从哲学的角度来解决这个问题,而不是技术上的问题,往往可以提供洞察力.在这种情况下的哲学是作为一个偏执的程序员.假设你今天写的代码将在几个月或几年后被破坏. (编辑每个@诺亚的评论如下:通常情况下,这个nitwit是我自己,作为一个偏执的程序员,我可能比其他任何人都更加保护我.)如果你可以做一些事情来确保当nitwit打破你的代码失败在产品发货之前,这将有所帮助.
我喜欢使用的两件事情是静态断言和单元测试.静态断言可以在您的operator ==代码中使用,以验证您的类的大小是您期望的大小.例如:
bool MyClass::operator==(const MyClass& rhs) const { static_assert(sizeof(MyClass) == sizeof(foo_) + sizeof(bar_)) ... }
foo_和bar_是成员变量.当类的大小发生变化时,这将会中断编译.
由于静态断言通常采用模板类的形式,当该表达式为false时将无法编译.这可能有点棘手(但这是一个有趣的练习 – 考虑如果您尝试添加一个char test_ [0]成员到一个类)会发生什么.幸运的是,这个轮子已经被发明了.参见Boost的一个例子,我认为新的MSVC编译器也有一个.