operator [] =重载?

时间:2010-10-11 14:10:15

标签: c++ operator-overloading brackets

好吧,我正在尝试将一个快速的小类作为一种哈希表来工作。如果我可以让它工作,那么我应该能够这样做:

  StringHash* hash = new StringHash;
  hash["test"] = "This is a test";
  printf(hash["test"]);

它应该打印出“这是一个测试”。

此时看起来我有2个问题。首先我这样做了:

const char* operator[](const char* key) {
  for(int i = 0; i < hashSize; ++i) {
    if(strcmp(hkeys[i], key) == 0) {return values[i];}
  }
  return NULL;
}

但是当我尝试查找值时,编译器会抱怨

错误:无效类型`StringHash * [const char [5]]'用于数组下标

其次,operator [] =似乎不是正确的语法。我能找到的唯一另一件事是&amp; operator []但是我不认为这会起作用,因为我必须编写查找程序??? (这种语法不仅仅用于返回数组项引用吗?)

我想在这里做什么甚至可能吗?任何建议表示赞赏:)


似乎对我正在尝试做的事情感到困惑。我会发布我的代码:

http://pastebin.com/5Na1Xvaz


所有帮助后的成品:

http://pastebin.com/gx4gnYy8

8 个答案:

答案 0 :(得分:6)

错误是因为hash是一个指针。改为:

StringHash hash;

答案 1 :(得分:4)

其他答案与您的第一个问题有关。至于你的第二个......

如果您返回引用,那么您将返回左值。您始终可以分配左值。

是的,它(几乎)真的很简单。我建议您仔细阅读是否在不同的地方需要const

我记得读到的是,您应为const提供const和非operator[]重载,如下所示:

MyType const &operator[](int index) const; // This is the array access version (no assignment allowed), which should work on const objects
MyType &operator[](int index);      // This is the array access or assignment version, which is necessarily non-const.

有关详细信息,请参阅此链接。

答案 2 :(得分:3)

hash不是StringHash个对象。它指向一个。

你可以这样做:

(*hash)["test"] = "This is a test";

或者你可以问问自己为什么你需要一个指向它的指针,

StringHash hash;
hash["test" = "This is a test";

...或者即使你这样做,为什么你不会使用像auto_ptr这样的智能指针。

#include <memory>
std::auto_ptr<StringHash> hash( new StringHash );
(*hash)["test"] = "This is a test";

答案 3 :(得分:2)

StringHash hash;而不是new。 C ++不是Java。 : - )

答案 4 :(得分:2)

第一个错误是你声明哈希是一个指针。指针类型已经可以与索引运算符一起使用。例如,指针[3]相当于*(指针+ 3)。你无法改变这种行为。哈希对象本身:

StringHash sh;

至于operator [] =,没有这样的东西。您的索引运算符应该只返回一个引用,以使赋值工作。这是一个简单的例子:

class Indexable
{
   std::string arr[3];
public:
   std::string & operator[](int index) {
      return arr[index];
   }
   std::string const& operator[](int index) const {
      return arr[index];
   }
};

答案 5 :(得分:2)

五个问题:

  1. hash是指向StringHash的指针,您必须取消引用它才能使用运算符:(*hash)["test"]
  2. 如果要分配给元素,则必须返回对元素类型

    的引用

    const char *& operator[] (const char* key);

    // ...

    (*hash)["test"] = "This is a test"; // will compile now

  3. null不是C ++中的关键字。使用0或NULL

  4. operator []必须为元素分配空间(如果找不到)。返回NULL不是一种选择。否则,尝试分配(*hash)["test"]的结果会导致程序崩溃。
  5. 使用std :: map或std :: tr1 :: unordered_map而不是编写自己的“快速”类。
  6. 只是成为一个混蛋:你知道这不是哈希表,对吗?

答案 6 :(得分:2)

我首先会质疑为什么你在编写自己的HashMap时有一些版本可用,虽然不是标准版本。

你的hash-map是否存储const char * pointers或std :: strings? (它可能存储const char *指针,如果它只是存储在别处的数据的查找表,不会改变其生命周期)。

当找不到该项目时,operator []应该做什么?

现在让我假设答案是:   - 是的,我们存储const char *指针,我们在空单元格中存储NULL   - 当我们执行hash [key] = value时,我们想要将key与value相关联   - 如果我们只是执行hash [key]但不写,则不会插入

这可以使用魔术对象完成:当您为此对象分配const char *时,它会插入或覆盖该哈希。您还可以从对象隐式转换为const char *以进行读取。

虽然这很复杂,但最好坚持使用map的常规接口:operator []总是插入,而你只是使用不同的方法进行查找。

答案 7 :(得分:1)

您是否可以使用boost::unordered_map<std::string, std::string?那么你不必担心自己实现这个。

假设这是对你自己的某种锻炼: 您可能来自不同的背景,但在C ++中,声明哈希的常规方法是:

StringHash hash;

此外,您的operator[]可能适用于打印,但它不适用于作业。通常,operator[]方法通过返回可以为其分配新值的非const引用或代理对象来工作,而您的方法也不会。如果你能够使用std :: string,你可以重写你的方法,将非const引用返回到应该读取或分配的哈希中的位置。