加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:47:15 所属栏目:百科 来源:网络整理
导读:所有问候, 可以在C中制作一个未来安全的比较运算符(==)吗? 我遇到的问题是我们有一个有多个成员的课程.我们有一个比较运算符来验证对象的instance-1是否与instance-2具有相同的值. 即我们可以做 class blarg { .....};.....blarg b1(..initializers...);bla
所有问候,

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读