看过c++ primer第四版的进来。
图片中的内容,我已经看了十遍了。可是还是不明白书中说的意思。为什么不能定义operator<函数呢?这一段在书的441页谁帮我解释一下?...
图片中的内容,我已经看了十遍了。可是还是不明白书中说的意思。为什么不能定义operator <函数呢?
这一段在书的441页
谁帮我解释一下? 展开
这一段在书的441页
谁帮我解释一下? 展开
展开全部
我没读过C++ PRIMER第四版,不过这段话的意思倒是很明显:
有一个名为Sales_item的class或者struct,里面至少包含了两个成员:ISBN和销售数据。
现在想为它重载操作符<和==。
==操作符只有在ISBN和销售数据都相等的时候,才会返回true。
如果想让Sales_item可以做为std::map(也就是所谓的关联容器)的key值,就必须为Sales_item提供一个比较方法,这样才能实现对Sales_item的排序。那么有两种办法:
1. 为sales_item定义一个functor。具体做法参考第15章。
2. 为Sales_item定义<操作符。但是这样会引发逻辑悖论。假历链设有两个整数a和b,判断他们是否相肢族孙等,有两个等价的办法:a==b 或者 !(a<b || b<a) 。这两个表达式的值一定是相等的!后面这种办法虽然看起来很麻烦,但是在STL里很多情况都是用这种办法来判断两个对象是否相等的。
关键的地方来了:因为Sales_item希望只按照ISBN排序,所以在为Sales_item定义<操作符时,要忽略掉销售数据。现在假设穗祥有两个对象a和b,他们的ISBN相等,销售数据不同,那么会发生这样的悖论:
a < b ---- false (a不小于b,因为他们ISBN相同)
b < a ---- false (b不小于a,因为他们ISBN相同)
所以!(a<b || b<a)的值是true。
a == b ---- false! (但是之前定义==操作符的时候,还比较了销售数据,所以a==b也不能成立!这跟!(a<b || b<a)的值不一样了!STL里有些代码会把a==b 和 !(a<b || b<a) 视为等价的表达式,这中逻辑悖论会导致那些代码出错)
有一个名为Sales_item的class或者struct,里面至少包含了两个成员:ISBN和销售数据。
现在想为它重载操作符<和==。
==操作符只有在ISBN和销售数据都相等的时候,才会返回true。
如果想让Sales_item可以做为std::map(也就是所谓的关联容器)的key值,就必须为Sales_item提供一个比较方法,这样才能实现对Sales_item的排序。那么有两种办法:
1. 为sales_item定义一个functor。具体做法参考第15章。
2. 为Sales_item定义<操作符。但是这样会引发逻辑悖论。假历链设有两个整数a和b,判断他们是否相肢族孙等,有两个等价的办法:a==b 或者 !(a<b || b<a) 。这两个表达式的值一定是相等的!后面这种办法虽然看起来很麻烦,但是在STL里很多情况都是用这种办法来判断两个对象是否相等的。
关键的地方来了:因为Sales_item希望只按照ISBN排序,所以在为Sales_item定义<操作符时,要忽略掉销售数据。现在假设穗祥有两个对象a和b,他们的ISBN相等,销售数据不同,那么会发生这样的悖论:
a < b ---- false (a不小于b,因为他们ISBN相同)
b < a ---- false (b不小于a,因为他们ISBN相同)
所以!(a<b || b<a)的值是true。
a == b ---- false! (但是之前定义==操作符的时候,还比较了销售数据,所以a==b也不能成立!这跟!(a<b || b<a)的值不一样了!STL里有些代码会把a==b 和 !(a<b || b<a) 视为等价的表达式,这中逻辑悖论会导致那些代码出错)
展开全部
因为一旦定义了比较isbn的operator<,那么对于两个sale_item都有相同的isbn来说通过operator<运算随便哪一个都不小于另外一个,则说明两个sale_item应该是相等的,但是具体定义相等的时候这个类中还有另埋辩差外的数据成员,一旦这些弯皮另外的数据成员不同,这等于号是不成立的,这就形成了一灶唯种情况是isbn都相等而另外的数据不相等导致用operator<来判断两个sale_item相等,而用operator=来判断又不相等形成矛盾
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询