Manter o Estado do Objeto de Informação ao Chamar o Construtor Sobrecarregado de Construtor Padrão
-
21-12-2019 - |
Pergunta
Essa pergunta do título é um bocado.Basicamente, eu estou criando uma tabela de hash, estrutura que usa duplamente ligadas listas dentro de um vetor.Tudo funciona bem quando eu crio o objeto usando o meu construtor sobrecarregado, mas usando o construtor padrão faz com que o estado do objeto para ir funky depois de voltar para principal.
Meu construtores de:
HashTable::HashTable()
{
HashTable(53);
}
HashTable::HashTable(int tableSize)
{
currentSize = tableSize;
table.resize(tableSize);
}
Definir pontos de interrupção depois de criar um objeto
HashTable ht(size); //this works
HashTable ht; //this does not work
Percorrendo o código de eu ver que ele chama o construtor sobrecarregado bem, mas depois de voltar para principal e, em seguida, tentar utilizar a tabela (quando usar o construtor padrão), o vetor de tamanho e a variável currentSize deram errado.
Depois de criar o objeto, antes de voltar para principal:
currentSize = 53
table [size] = 53, [capacity] = 53, empty linked lists fill the vector
Quando chamar ht.hash(value)
no principal, o objeto agora:
currentSize = -858993460
table [size] = 0, [capacity] = 0, linked lists obviously gone.
O que faria com que o vetor de redefinir-se a 0 e o meu private int currentSize para ir funky, especialmente desde que o código de ambos os percursos de trabalho através de HashTable(int tableSize)
?
Solução
@dyp me Apontou a direção certa.
HashTable(53);
foi a criação de um local temporário objeto - a não definição do objeto principal do meu tamanho desejado de 53.
Para chamar o construtor sobrecarregado no meu objeto principal, em vez de criar um objeto temporário, this->HashTable::HashTable(53);
trabalhadas (Visual Studio) para forçar o construtor sobrecarregado para ser chamado de meu objeto de chamada.
EDITAR:compilador gcc proíbe isso, e isso geralmente é considerado má prática, se o seu compilador permite-lo ou não.
Uma lista de inicializador como HashTable::HashTable() : HashTable(53) {}
é considerada a forma correta de realizar o que eu estava tentando fazer.