Manter o Estado do Objeto de Informação ao Chamar o Construtor Sobrecarregado de Construtor Padrão

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

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)?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top