我正在使用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'没有重载的'member operator -〉'“。
2条答案
按热度按时间wvmv3b1j1#
你的困惑是可以理解的。
m_Table
变量确实是一个指针,但它指向的是一个item
结构体数组,而不是一个指向item
结构体的指针数组。所以当你使用m_Table[i]
时,你是在直接访问一个item结构体,而不是一个指向item
结构体的指针。当你直接访问一个
item
结构体时,你应该使用点运算符来访问它的成员变量,如下所示:如果你有一个指向
item
结构体的指针数组,你可以像你提到的那样使用箭头操作符:要创建指向
item
结构体的指针数组,您需要相应地更改m_Table
的类型和构造函数中的内存分配:一个二个一个一个
但是,由于当前的实现已经可以正常工作,并且直接使用了
item
结构体数组,因此应该继续使用点运算符。ekqde3dh2#
m_Table
被声明为item对象数组,而不是item指针数组。要访问m_Table[i]
的成员变量,您应该使用m_Table[i].name
而不是m_Table[i]->name
来访问数组中第i个元素的name成员变量。我认为
->
出现编译错误的原因是item结构体没有任何指针作为成员变量--next成员变量本身是item对象,而不是指向item对象的指针,如果将next定义为item* 指针,则可以使用->
访问其成员变量。