C++ 从默认构造函数调用重载构造函数时维护对象状态信息
那个问题的标题太过分了。 基本上,我正在创建一个哈希表结构,它在向量中使用双链接列表。当我使用重载构造函数创建对象时,一切都正常,但是使用默认构造函数会导致对象在返回到main后状态变差 我的构造器:C++ 从默认构造函数调用重载构造函数时维护对象状态信息,c++,cohesion,constructor-overloading,C++,Cohesion,Constructor Overloading,那个问题的标题太过分了。 基本上,我正在创建一个哈希表结构,它在向量中使用双链接列表。当我使用重载构造函数创建对象时,一切都正常,但是使用默认构造函数会导致对象在返回到main后状态变差 我的构造器: HashTable::HashTable() { HashTable(53); } HashTable::HashTable(int tableSize) { currentSize = tableSize;
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变为funky,特别是因为代码路径都通过HashTable(int tableSize)工作?@dyp为我指明了正确的方向
哈希表(53)代码>正在创建一个临时本地对象-未将main中的对象设置为我所需的大小53
要在main中对我的对象调用重载构造函数,而不是创建临时对象,this->HashTable::HashTable(53)代码>工作(在VisualStudio中)强制对调用对象调用重载构造函数
编辑:gcc编译器禁止这样做,不管编译器是否允许,这通常被认为是不好的做法
初始值设定项列表为HashTable::HashTable():HashTable(53){}
被认为是完成我试图做的事情的正确方法。HashTable(53)代码>这不会委托给另一个构造函数。IIRC它创建一个临时的。在C++11中,您可以通过HashTable::HashTable():HashTable(53){}
(搜索委托构造函数和/或成员初始值设定项列表)委托给另一个构造函数。@dyp-谢谢<代码>此->哈希表::哈希表(53)代码>或初始值设定项列表非常有效。this->HashTable::HashTable(53)
o.o构造函数不是可以直接调用的普通函数。@dyp,我只是从默认构造函数调用重载构造函数。您可能不需要默认构造函数,只需给tableSize
一个默认值-HashTable::HashTable(int tableSize=53)
。除非有其他具体的原因,你这样做了……”而且有点干净。“不仅仅是一点。”。我很想知道你是如何编译你的编译器的,因为C++禁止你直接调用构造函数。版本HashTable::HashTable():HashTable(53){}
是有效的C++11,该特性称为deleging constructor.Hmm。我读到C++禁止用户调用构造函数:<代码> Fo.f;f、 Foo()代码>-也许我需要在声明方法时回顾一下标准,因为我没有看到任何明确的说明,不能在类声明中让构造函数调用重载构造函数。VS对我的构造函数声明没有问题,所以我确信它的组装方式与您的gcc示例不同。再说一次,我不是在叫foof;f、 Foo()
,我只需要在Foo f;及富富(国际),代码>。