从默认构造函数调用重载的构造函数时维护对象状态信息

时间:2014-04-12 22:36:51

标签: c++ cohesion constructor-overloading

这个问题标题是满口的。 基本上,我正在创建一个哈希表结构,在结构中使用双向链表。当我使用重载的构造函数创建对象时,一切正常,但是使用默认构造函数会导致对象的状态在返回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)工作?

1 个答案:

答案 0 :(得分:0)

@dyp指出我正确的方向。

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

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

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

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