C++ 类的构造函数中的箭头运算符

问题描述 投票:0回答:2

我在 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 ->'”。

c++ constructor hashtable dynamic-memory-allocation new-operator
2个回答
1
投票

你的困惑是可以理解的。

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
结构数组,因此您应该继续使用点运算符。


0
投票

m_Table
被声明为项目对象数组,而不是项目指针数组。要访问
m_Table[i]
的成员变量,应该使用
m_Table[i].name
而不是
m_Table[i]->name
来访问数组中第i个元素的name成员变量。

我认为

->
出现编译器错误的原因是 item 结构没有任何指针作为成员变量——下一个成员变量本身是一个 item 对象,而不是指向 item 对象的指针。如果您已将 next 定义为 item* 指针,则可以使用
->
访问其成员变量。

© www.soinside.com 2019 - 2024. All rights reserved.