可以在C中制作“未来安全”比较 *** 作符吗?

可以在C中制作“未来安全”比较 *** 作符吗?,第1张

概述所有问候, 可以在C中制作一个未来安全的比较运算符(==)吗? 我遇到的问题是我们有一个有多个成员的课程.我们有一个比较运算符来验证对象的instance-1是否与instance-2具有相同的值. 即我们可以做 class blarg { .....};.....blarg b1(..initializers...);blarg b2 = b1;if (b1 == 所有问候,

可以在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编译器也有一个.

总结

以上是内存溢出为你收集整理的可以在C中制作“未来安全”比较 *** 作符吗?全部内容,希望文章能够帮你解决可以在C中制作“未来安全”比较 *** 作符吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1249991.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存