我在 C++ 中的哈希表中工作,我希望动态分配它以支持表可能被声明为非常大的大小的情况。
代码正在运行,看起来像:
class HashTable {
private:
static const int m_TableSize = 4;
struct item {
std::string name;
std::string drink;
item* next;
};
item* m_Table;
public:
HashTable();
~HashTable();
};
HashTable::HashTable()
{
m_Table = new item[m_TableSize];
for (int i = 0; i < m_TableSize; i++)
{
m_Table[i].name = "empty";
m_Table[i].drink = "empty";
m_Table[i].next = nullptr;
}
}
HashTable::~HashTable() {
delete[] m_Table;
}
这是我的问题:
即使我使用的是 new 关键字并且表被定义为指针数组
item*
,在构造函数中,是否没有必要使用箭头运算符访问m_Table
内的成员变量,如行中所示下面?
m_Table[i]->name = "empty";
最初,我尝试使用箭头运算符,但出现编译器错误:“type 'HashTable::item' does not have overloaded 'member operator ->'”。
你的困惑是可以理解的。
m_Table
变量确实是一个指针,但它指向一个 item
结构数组,而不是一个指向 item
结构的指针数组。因此,当您使用 m_Table[i]
时,您正在直接访问项目结构,而不是指向 item
结构的指针。
当你直接访问一个
item
结构时,你应该使用点运算符来访问它的成员变量,像这样:
m_Table[i].name = "empty";
m_Table[i].drink = "empty";
m_Table[i].next = nullptr;
如果你有一个指向
item
结构的指针数组,你会像你提到的那样使用箭头运算符:
m_Table[i]->name = "empty";
要创建指向
item
结构的指针数组,您需要相应地更改 m_Table
的类型和构造函数中的内存分配:
item** m_Table;
HashTable::HashTable()
{
m_Table = new item*[m_TableSize];
for (int i = 0; i < m_TableSize; i++)
{
m_Table[i] = new item;
m_Table[i]->name = "empty";
m_Table[i]->drink = "empty";
m_Table[i]->next = nullptr;
}
}
但是由于您当前的实现已经可以正常工作,并且您直接使用了一个
item
结构数组,因此您应该继续使用点运算符。
m_Table
被声明为项目对象数组,而不是项目指针数组。要访问m_Table[i]
的成员变量,应该使用m_Table[i].name
而不是m_Table[i]->name
来访问数组中第i个元素的name成员变量。
我认为
->
出现编译器错误的原因是 item 结构没有任何指针作为成员变量——下一个成员变量本身是一个 item 对象,而不是指向 item 对象的指针。如果您已将 next 定义为 item* 指针,则可以使用 ->
访问其成员变量。