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

icnyk63a  于 2023-04-01  发布在  其他
关注(0)|答案(2)|浏览(109)

我正在使用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 -〉'“。

wvmv3b1j

wvmv3b1j1#

你的困惑是可以理解的。m_Table变量确实是一个指针,但它指向的是一个item结构体数组,而不是一个指向item结构体的指针数组。所以当你使用m_Table[i]时,你是在直接访问一个item结构体,而不是一个指向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结构体数组,因此应该继续使用点运算符。

ekqde3dh

ekqde3dh2#

m_Table被声明为item对象数组,而不是item指针数组。要访问m_Table[i]的成员变量,您应该使用m_Table[i].name而不是m_Table[i]->name来访问数组中第i个元素的name成员变量。
我认为->出现编译错误的原因是item结构体没有任何指针作为成员变量--next成员变量本身是item对象,而不是指向item对象的指针,如果将next定义为item* 指针,则可以使用->访问其成员变量。

相关问题