我正在为我的数据结构类编写一个哈希表,我想在我的实现中添加一些语法糖。
template <typename HashedObj, typename Object>
Object & Dictionary<HashedObj, Object>::operator[](HashedObj & key)
{
return items.lookup(key);
}
当我做像cout&lt;&lt; DICT [ “的myKey”]。 但是如何使用括号进行分配?类似于:
dict["mykey"] = "something";
不,这不是我的家庭作业的一部分(没有双关语),我只想更好地学习C ++。
答案 0 :(得分:5)
目前尚不清楚你在这里问的是什么。您提供的代码已支持分配。只是做它并随意工作(或至少它应该编译)。使用重载[]
的赋值运算符的哪一侧绝对没有区别。它将在左侧(LHS)以与在赋值的右侧(RHS)完全相同的方式工作(或作为<<
的操作数,与原始帖子中一样)。您的[]
会返回对Object
的引用,然后实际分配由Object
类型的赋值运算符处理,这意味着[]
本身并未真正涉及在实际的任务中。
这里真正的问题是您希望[]
如何在某些特殊情况下采取行动。如果表中没有您的密钥,会发生什么?在这种情况下,参考Object
将lookup
返回的内容?
从你发布的内容中弄清楚是不可能的。我看到它返回一个引用,因此返回NULL
是不可能的。它是否为给定的密钥插入一个新的空Object
?如果是这样,那么你不必做任何事情。您的[]
已经完全准备好用于分配的LHS。 (这是[]
std::map
的工作方式,BTW)
如果您的lookup
返回对特殊“警卫”Object
的引用,则必须采取特殊步骤。您可能不希望将任何内容分配给“guard”对象,因此您必须以某种方式“禁用”其赋值运算符并且您已完成。其余的应该按原样运作。
如果您的lookup
在不存在密钥的情况下抛出异常,那么您必须确定在分配的LHS上使用[]
时这是否是您想要的。如果是这样,那么你不需要做任何事情。如果没有,那么还需要一些额外的工作......
那么,如果您将不存在的密钥传递给lookup
会发生什么?
P.S。此外,使用[]
参数或lookup
参数声明const HashedObj&
(和HashedObj
)通常更有意义。在您的示例中,非const引用看起来很奇怪,并且可能在某些(实际上,在大多数情况下)情况下导致问题。我很惊讶它现在适合你......
答案 1 :(得分:3)
你需要超载2次。一个将是const
,它将是data access
部分,另一个将返回一个引用,它将作为“设置者”。
答案 2 :(得分:2)
您正在寻找的功能类似于std::map
中的重载括号运算符。在std::map
中,括号运算符执行查找并返回对与特定键关联的对象的引用。如果地图不包含与该键关联的任何对象,则操作员使用默认构造函数将新对象插入到地图中。
因此,如果您有std::map<K,V> mymap
,则调用mymap[someKey]
将返回对与someKey
关联的值的引用,否则它将创建类型为{{1}的新对象通过调用V
(V的默认构造函数)然后返回对该新对象的引用,这允许调用者为该对象赋值。