Mantenere le informazioni di stato dell'oggetto quando chiamano il costruttore sovraccarico dal costruttore predefinito

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

Domanda

Quel titolo di domanda è un boccone. Fondamentalmente, sto creando una struttura della tabella hash che utilizza elenchi doppiamente collegati all'interno di un vettore. Tutto funziona bene quando creo l'oggetto usando il mio costruttore sovraccarico, ma usando il costruttore predefinito fa sì che lo stato dell'oggetto venga funky dopo il ritorno a Main.

I miei costruttori:

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

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

Impostazione dei punti di interruzione dopo aver creato un oggetto

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

Aspettando il codice Vedo che chiama il costruttore sovraccarico Fine, ma dopo aver tornato a Main e quindi il tentativo di utilizzare la tabella (quando si utilizza solo il costruttore predefinito), le dimensioni del vettore e la variabile sono andati male. .

Dopo aver creato l'oggetto, prima di tornare a Main:

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

Quando si chiama ht.hash(value) in Main, ora l'oggetto ha:

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

Cosa farà che il vettore si ripristinisca a 0 e il mio Privato Int Currences per diventare funky, soprattutto perché i percorsi di codice funzionano entrambi attraverso HashTable(int tableSize)?

È stato utile?

Soluzione

@DyP mi ha indicato nella giusta direzione.

HashTable(53); stava creando un oggetto locale temporaneo - non impostando l'oggetto in principale dimensioni della mia dimensione desiderata di 53.

Per chiamare il costruttore sovraccarico sul mio oggetto in principale piuttosto che creare un oggetto temporaneo, this->HashTable::HashTable(53); ha funzionato (in Visual Studio) per forzare il costruttore sovraccarico da richiamare sul mio oggetto chiamante.

Modifica: il compilatore GCC lo proibisce, e questo è generalmente considerato cattiva pratica, se il tuo compilatore lo consente o meno.

Un elenco di inizializzazione come HashTable::HashTable() : HashTable(53) {} è considerato il modo corretto per realizzare ciò che stavo cercando di fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top