这个问题标题是满口的。 基本上,我正在创建一个哈希表结构,在结构中使用双向链表。当我使用重载的构造函数创建对象时,一切正常,但是使用默认构造函数会导致对象的状态在返回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而我的private int currentSize变得很时髦,特别是因为代码路径都通过HashTable(int tableSize)
工作?
答案 0 :(得分:0)
@dyp指出我正确的方向。
HashTable(53);
正在创建一个临时本地对象 - 不将main中的对象设置为我想要的53的大小。
要在main中调用我的对象上的重载构造函数而不是创建一个临时对象,this->HashTable::HashTable(53);
工作(在Visual Studio中)以强制在我的调用对象上调用重载的构造函数。
编辑:gcc编译器禁止这样做,这通常被认为是不好的做法,无论你的编译器是否允许。
初始化列表HashTable::HashTable() : HashTable(53) {}
被认为是完成我想要做的事情的正确方法。