Название вопроса — полный рот.
По сути, я создаю структуру хэш-таблицы, которая использует двусвязные списки внутри вектора. Все работает нормально, когда я создаю объект, используя мой перегруженный конструктор, но использование конструктора по умолчанию приводит к тому, что состояние объекта меняется после возвращения в 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 пошли не так.
После создания объекта, прежде чем вернуться к основному:
currentSize = 53
table [size] = 53, [capacity] = 53, empty linked lists fill the vector
При звонке ht.hash(value)
в основном объект теперь имеет:
currentSize = -858993460
table [size] = 0, [capacity] = 0, linked lists obviously gone.
Что могло бы заставить вектор сбрасывать себя в 0, и мой приватный int currentSize становился фанк, тем более что пути к коду оба работают через HashTable(int tableSize)
?
@dyp указал мне в правильном направлении.
HashTable(53);
создавал временный локальный объект — не устанавливая объект в main для моего желаемого размера 53.
Чтобы вызвать перегруженный конструктор для моего объекта в основном, а не создавать временный объект, this->HashTable::HashTable(53);
работал (в Visual Studio), чтобы заставить перегруженный конструктор вызываться на мой вызывающий объект.
РЕДАКТИРОВАТЬ: компилятор gcc запрещает это, и это обычно считается плохой практикой, независимо от того, позволяет это ваш компилятор или нет.
Список инициализаторов как HashTable::HashTable() : HashTable(53) {}
считается правильным способом выполнить то, что я пытался сделать.
Других решений пока нет …