在编译此代码时,我正试图为简单对象创建一个哈希表
#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]|
我无法弄清楚我做错了什么。我会感激任何帮助。
答案 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