Pergunta

Eu tenho uma aula que quero empurrar em um deque. O problema é que, quando recuo, preciso que o objeto original seja alterado, portanto, preciso de um ctor não const. Agora, se eu implementar, minha cópia const CTOR é chamada. Se eu removeu o const CTOR, recebo um erro de compilação sobre nenhum CTORS disponível. Como implemento isso de uma maneira que posso modificar a estrutura original quando a passar? Eu preciso modificá -lo como a classe destruir os objetos quando ela sair do escopo e gostaria de dizer isso para não fazê -lo quando houver outra instância. Não posso usar o Boost, pois minha plataforma não a suporta.

Foi útil?

Solução

Seu problema é que um requisito fundamental dos contêineres padrão é que os objetos são construídos com cópias. Isso não significa apenas que eles têm um construtor de cópia, mas também significa que, se você copiar o objeto, a cópia e o original são os mesmos.

Seu objeto, no entanto, se assemelha a uma semântica de movimentação. Ou seja, após uma mudança, o novo objeto possui o recurso e o objeto antigo está vazio. Isso não é suportado por Deque a partir de C ++ 03. Ou seja, a propósito, a mesma razão que proíbe colocar o Auto_PTR em um contêiner.

A próxima versão C ++, chamada C ++ 0x, suportará essas semânticas de mover, introduzindo construtores de movimentos especiais. Até então, você terá que usar um objeto que ações Propriedade quando você deseja colocá -lo em um contêiner padrão. Isso significa que, se você copiar seu objeto e o original sair do escopo, o recurso de propriedade não será libertado até que todas as cópias saiam do escopo. Considere usar o boost :: shared_ptr, por exemplo, ou envolva -o em sua classe, se você não deseja programar sua própria classe gerenciando isso.

Outras dicas

Se você não está fazendo nada desonesto com os recursos (veja outros comentários), fazendo a variável do membro que deseja mudar mutável Permitirá alterá -lo em uma função const.

Você não pode fazer o que está tentando fazer. Você terá que usar ponteiros, simples ou inteligentes (mas não auto_ptr <>). Por que você não pode usar o Boost Smart Poonters? Eles são bastante leves e devem funcionar em todos os compiladores C ++ razoavelmente padrão. Você não precisa usar todo o impulso.

Dependendo do que você está tentando fazer (mais detalhes seriam bons), você pode modificar o objeto antes/depois de ligar push_back Ou escreva uma classe de wrapper simples que leva um ponteiro para sua classe e pode ser inserido em um deque. Este objeto pode então fazer a coisa apropriada para sua classe em construção/destruição/etc.

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