0

这个问题的标题很拗口。基本上,我正在创建一个在向量中使用双向链表的哈希表结构。当我使用重载的构造函数创建对象时,一切正常,但是使用默认构造函数会导致对象的状态在返回到 main 后变得时髦。

我的构造函数:

    HashTable::HashTable()
    {
            HashTable(53);
    }

    HashTable::HashTable(int tableSize)
    {
            currentSize = tableSize;
            table.resize(tableSize);
    }

创建对象后设置断点

    HashTable ht(size); //this works
    HashTable ht;       //this does not work

单步执行代码,我看到它调用了重载的构造函数,但是在返回 main 然后尝试使用表(仅使用默认构造函数时)后,向量的大小和变量 currentSize 出错了。

创建对象后,返回main之前:

currentSize = 53
table [size] = 53, [capacity] = 53, empty linked lists fill the vector

在 main 中调用ht.hash(value)时,该对象现在具有:

currentSize = -858993460
table [size] = 0, [capacity] = 0, linked lists obviously gone.

什么会导致向量将自身重置为 0 并且我的私有 int currentSize 变得时髦,特别是因为代码路径都可以通过HashTable(int tableSize)

4

1 回答 1

0

@dyp 为我指明了正确的方向。

HashTable(53);正在创建一个临时本地对象 - 没有将 main 中的对象设置为我想要的 53 大小。

为了在 main 中调用我的对象上的重载构造函数而不是创建一个临时对象,this->HashTable::HashTable(53);工作(在 Visual Studio 中)强制在我的调用对象上调用重载构造函数。

编辑:gcc 编译器禁止这样做,这通常被认为是不好的做法,无论您的编译器是否允许。

初始化列表HashTable::HashTable() : HashTable(53) {}被认为是完成我想做的事情的正确方法。

于 2014-04-24T16:07:00.737 回答