重载括号访问和赋值C ++

时间:2009-10-24 17:05:14

标签: c++ operator-overloading

我正在为我的数据结构类编写一个哈希表,我想在我的实现中添加一些语法糖。

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 ++。

3 个答案:

答案 0 :(得分:5)

目前尚不清楚你在这里问的是什么。您提供的代码已支持分配。只是做它并随意工作(或至少它应该编译)。使用重载[]的赋值运算符的哪一侧绝对没有区别。它将在左侧(LHS)以与在赋值的右侧(RHS)完全相同的方式工作(或作为<<的操作数,与原始帖子中一样)。您的[]会返回对Object的引用,然后实际分配由Object类型的赋值运算符处理,这意味着[]本身并未真正涉及在实际的任务中。

这里真正的问题是您希望[]如何在某些特殊情况下采取行动。如果表中没有您的密钥,会发生什么?在这种情况下,参考Objectlookup返回的内容?

从你发布的内容中弄清楚是不可能的。我看到它返回一个引用,因此返回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的默认构造函数)然后返回对该新对象的引用,这允许调用者为该对象赋值。