Mat*_*att 3 c++ operator-overloading
我正在为我的数据结构类编写一个哈希表,我想在我的实现中添加一些语法糖.
template <typename HashedObj, typename Object>
Object & Dictionary<HashedObj, Object>::operator[](HashedObj & key)
{
return items.lookup(key);
}
Run Code Online (Sandbox Code Playgroud)
当我做cout << dict ["mykey"]这样的事情时,这很好.但我怎么能用括号做作业呢?就像是:
dict["mykey"] = "something";
Run Code Online (Sandbox Code Playgroud)
不,这不是我的家庭作业的一部分(没有双关语意),我只想更好地学习C++.
目前尚不清楚你究竟在这里问什么.您提供的代码已支持分配.只是做它并随意工作(或至少它应该编译).[]使用过载的赋值运算符的哪一侧绝对没有区别.它将在左侧(LHS)以与在赋值的右侧(RHS)完全相同的方式工作(或作为<<原始帖子中的操作数).您[]返回对a的引用Object,然后实际赋值由您的Object类型的赋值运算符处理,这意味着它[]本身并不真正涉及实际赋值.
这里真正的问题是你希望你如何[]在某些特殊情况下采取行动.如果表中没有您的密钥,会发生什么?在这种情况下参考Object你lookup要返回的内容?
从你发布的内容中弄清楚是不可能的.我看到它返回一个引用,所以返回NULL是不可能的.它是否Object为给定的密钥插入一个新的空?如果是这样,那么你不必做任何事情.您[]已完全准备好在分配的LHS上使用.(这是如何[]在std::map作品中,BTW)
如果您lookup返回对特殊"警卫"的引用Object,则必须采取特殊步骤.您可能不希望将任何内容分配给"guard"对象,因此您必须以某种方式"禁用"其赋值运算符并且您已完成.其余的应该按原样运作.
如果lookup在不存在密钥的情况下抛出异常,那么[]在分配的LHS上使用时,您必须确定这是否是您想要的.如果是这样,那么你不需要做任何事情.如果没有,那么还需要一些额外的工作......
那么,再次,如果你传递一个不存在的密钥会发生lookup什么?
PS此外,使用参数或仅参数声明[](和lookup)通常更有意义.在您的示例中,非const引用看起来很奇怪,并且可能在某些(实际上,在大多数情况下)情况下导致问题.我很惊讶它现在适合你...const HashedObj&HashedObj
| 归档时间: |
|
| 查看次数: |
4952 次 |
| 最近记录: |