Mantener la información del estado del objeto al llamar al constructor sobrecargado desde el constructor predeterminado

StackOverflow https://stackoverflow.com//questions/23036965

Pregunta

El título de esa pregunta es un bocado.Básicamente, estoy creando una estructura de tabla hash que utiliza listas doblemente enlazadas dentro de un vector.Todo funciona bien cuando creo el objeto usando mi constructor sobrecargado, pero usar el constructor predeterminado hace que el estado del objeto se vuelva extraño después de regresar a principal.

Mis constructores:

    HashTable::HashTable()
    {
            HashTable(53);
    }

    HashTable::HashTable(int tableSize)
    {
            currentSize = tableSize;
            table.resize(tableSize);
    }

Establecer puntos de interrupción después de crear un objeto

    HashTable ht(size); //this works
    HashTable ht;       //this does not work

Al revisar el código, veo que llama bien al constructor sobrecargado, pero después de regresar a main y luego intentar usar la tabla (cuando se usa solo el constructor predeterminado), el tamaño del vector y la variable currentSize han salido mal.

Después de crear el objeto, antes de regresar a principal:

currentSize = 53
table [size] = 53, [capacity] = 53, empty linked lists fill the vector

al llamar ht.hash(value) en main, el objeto ahora tiene:

currentSize = -858993460
table [size] = 0, [capacity] = 0, linked lists obviously gone.

¿Qué causaría que el vector se restableciera a 0 y que mi int currentSize privado se volviera extraño, especialmente porque ambas rutas de código funcionan? HashTable(int tableSize)?

¿Fue útil?

Solución

@dyp me señaló en la dirección correcta.

HashTable(53); estaba creando un objeto local temporal, no configurando el objeto en general en el tamaño deseado de 53.

Para llamar al constructor sobrecargado en mi objeto en general en lugar de crear un objeto temporal, se trabajó this->HashTable::HashTable(53); (en Visual Studio) para forzar al constructor sobrecargado para que se llame a mi objeto de llamada.

Editar: El compilador de GCC prohíbe esto, y esto generalmente se considera una mala práctica, ya sea que su compilador lo permita o no.

Una lista de inicializadores como HashTable::HashTable() : HashTable(53) {} se considera la forma correcta de lograr lo que estaba tratando de hacer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top