c ++中对象的哈希表

时间:2014-05-26 01:16:30

标签: c++ class hash

在编译此代码时,我正试图为简单对象创建一个哈希表

#include<iostream>
#include<string>
using namespace std;

class K {
   public:
      int n;
      K(int n): n(5) {}
};

class hTab {
      string * a;
      K * k;
      int r;
   public:
      hTab(int n): a(new string[n]), k(new K[n]), r(0) {}
      ~hTab() { delete [] k; delete [] a; }
      int getId(string s) {
         int i = 0;
         while (i != r && s != a[i]) {++i;}
         return i;
      }
      K & operator [] (string s) {
         a[r] = s;
         ++r;
         return k[r-1];
      }
      const K & operator [] (string s) const {return k[getId(s)];}
};

int main() {
   hTab tab(20);
   K a(5);
   tab["sth"] = a;
   cout << tab["sth"].n;
   return 0;
}

弹出以下错误。

In constructor 'hTab::hTab(int)'
16 error: no matching function for call to 'K::K()'
In member function 'const K& hTab::operator[](std::string) const'
28 error: passing 'const hTab' as 'this' argument of 'int hTab::getId(std::string)' discards qualifiers [-fpermissive]|

我无法弄清楚我做错了什么。我会感激任何帮助。

1 个答案:

答案 0 :(得分:4)

1第一个错误:no matching function for call to 'K::K()'来自hTab的构造函数。具体来说:new K[n]

在C ++中,当你创建一个类数组时,C ++会自动调用默认(空)构造函数。在这种情况下,它是K()。由于您已经为K定义了构造函数,因此默认构造函数不存在,因此您会收到错误。

要修复它,只需定义一个新函数K::K()即可执行您认为的默认值。

编辑:另外需要注意的是,在K::K(int n)中,参数n目前绝对没有任何作用。无论如何,成员变量n总是最终为5。如果你刚才做了K::K()那也可以解决你的问题。

2第二个错误:passing 'const hTab' as 'this' argument...来自operator[] (string s) const函数。

由于您在const中结束了函数声明,因此它无法更改类中的任何内容,或者调用非const函数。 getId(string s)不是const函数,因此不允许在那里调用它。 (即使它没有改变任何东西,C ++也不够聪明,不知道......)。

这个修复很简单,在getId声明的末尾添加一个const:

int getId(string s) const