C++哈希表实现:如何在一个头文件中调用另一头文件类的公共成员
问题原因
- 成员函数归属错误:你将
get_key()、get_value()定义在了B类中,但key、value是A类的公共成员,B类本身没有这两个成员,因此编译会报key未在当前作用域声明。同时你调用时是用A类实例table[hashindex]调用get_key(),但该方法属于B类,自然会报对应类没有该成员的错误。 - 构造函数笔误:A类的无参构造函数中你写了
empty = true,但实际定义的成员变量名是isempty,这个问题也会导致编译报错。 - 返回值类型错误:你定义的
get_key()返回值为A<X,Y>*,但A类中key的类型是模板参数X,类型完全不匹配。
修复方案
你不需要额外写get_key、get_value方法,A类的key和value本身就是公共成员,可以直接访问。
- 首先删除B类中你后加的两个错误的
get_key()、get_value()成员函数。 - 修改A类的无参构造函数笔误:
A<X,Y>(){ isempty = true; // 把empty改为isempty isremoved = false; }
- 修改search函数的实现,直接访问A类的公共成员:
template<typename X, typename Y> A<X,Y>* B<X,Y>::search(const X& key){ int hashindex = hashfunction(key); if(table[hashindex].key == key) // 返回匹配到的A类实例的指针 return &table[hashindex]; // 补充未找到的返回逻辑,避免编译警告 return nullptr; }
逻辑疑问解答
你声明A<X,Y>* table并在B的构造函数中new了数组,已经完成了A类实例的创建,这个逻辑没有问题,错误全部来自成员归属和调用逻辑的混淆。
内容的提问来源于stack exchange,提问作者suckatcoding
相关产品推荐
相关产品推荐

