Pergunta

Eu estou tentando escrever uma classe lista básica, isoladamente ligado em C ++. Eu fiz isso em minhas estruturas de dados anos de classe de volta, mas não me lembro os detalhes.

deve minha classe Node tem um construtor de cópia? Ele tem um nó * como uma variável de membro, e, tanto quanto eu sei que você está sempre deveria escrever um construtor de cópia, destruidor, e operador de atribuição de classes que têm membros dinâmicos. Mas pelo que eu vi na net, a classe List cuida da cópia de Nodes. É este realmente o caso, e em caso afirmativo, por quê?

Foi útil?

Solução

Você poderia fazer pior do que copiar o desenho de de sgi slist - biblioteca de sgi modelo ( "stl") foi a base para a parte da biblioteca padrão do C ++ que é muitas vezes ainda (não tecnicamente correcta ;-) referido como "stl". Infelizmente slist não fazê-lo (seu duplamente vinculada list primo OTOH fez isso, e tornou-se std::list) mas eu gosto dela.

Se você não quer modelo o tipo de carga útil e o alocador, não há problema em codificar-los, eu acho; mas o ponto chave a reter é que "nós" são um detalhe de implementação interna - só expor o recipiente tipo, com todo o bom, aspectos canônicos (e, claro, o tipo de carga deve ser conhecido - . - É não difícil de molde que, btw ;-), e você faz "nó" uma classe opaca em sua .h (que apenas contém uma class node;, e ponteiros para ele em sua class slist)

Outras dicas

Para um básico classe de lista isoladamente ligada, eu recomendo:

  • Depois de alocar cada nó, não se movem nem copiar o nó após ser alocada
  • Por isso, desativar o Nó cópia classe contructor e operador de atribuição

C ++ gera um contructor e atribuição operador de cópia padrão se você não defini-los. Eu recomendo que você desativar esses padrões, declarando-los como privado e não implementá-las.


Mas pelo que tenho visto na net, a classe List cuida da cópia de Nodes. É este realmente o caso, e em caso afirmativo, por quê?

Ele cuida de nós copiando porque suporta copiar (fazer uma cópia) a lista inteira (o que significa fazer uma cópia de cada nó na lista).

Você não precisa apoiar copiar os nós, a menos que você suporta a cópia de toda a lista.

Se você tivesse uma lista vinculada isoladamente:

A1 -> B1 -> C1

e seu escreveu seu próprio construtor de cópia que, por sua vez chama o construtor de cópia no nó interno * membro, então você obtém:

A1 -> B1 -> C1
A2 -> B2 -> C2

O que você não deve fazer é chamar o construtor de cópia gerado implicitamente que não irá executar uma cópia em cascata, o que você vai conseguir é:

      A2
      |
      v
A1 -> B1 -> C1

Assim, ou escrever seu próprio construtor de cópia para fazer uma cópia profunda, ou definir um construtor de cópia privada que implementa um não-op.

Entre o std :: lista implementos uma lista e implementos duplamente ligada profunda cópia semântica.

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