Ведение информации о состоянии объекта при вызове перегруженного конструктора из конструктора по умолчанию

Название вопроса — полный рот.
По сути, я создаю структуру хэш-таблицы, которая использует двусвязные списки внутри вектора. Все работает нормально, когда я создаю объект, используя мой перегруженный конструктор, но использование конструктора по умолчанию приводит к тому, что состояние объекта меняется после возвращения в 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)?

0

Решение

@dyp указал мне в правильном направлении.

HashTable(53); создавал временный локальный объект — не устанавливая объект в main для моего желаемого размера 53.

Чтобы вызвать перегруженный конструктор для моего объекта в основном, а не создавать временный объект, this->HashTable::HashTable(53); работал (в Visual Studio), чтобы заставить перегруженный конструктор вызываться на мой вызывающий объект.

РЕДАКТИРОВАТЬ: компилятор gcc запрещает это, и это обычно считается плохой практикой, независимо от того, позволяет это ваш компилятор или нет.

Список инициализаторов как HashTable::HashTable() : HashTable(53) {} считается правильным способом выполнить то, что я пытался сделать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector