Pergunta

Vamos dizer que eu tenho um vetor de stl contendo tipo de classe "xx". xx é abstrato. Eu tenho que correr para o problema em que o compilador não vai me deixar "instanciar" quando eu faço algo como o seguinte:

std::vector<xx> victor;
void pusher(xx& thing)
{
    victor.push_back(thing);
}

void main()
{
    ;
}

Eu assumo isso é porque o construtor de cópia deve ser chamado. Tenho obtido contornar este problema armazenando xx * 's no vector em vez de xx de. Existe uma solução melhor? O que é isso?

Foi útil?

Solução

Quando você usa push_back, você está fazendo uma cópia do objeto e armazená-lo no vetor. Como você supôs, isso não funciona desde que você não pode instanciar uma classe abstrata, que é basicamente o que a cópia-construção está fazendo.

Usando um ponteiro é recomendado, ou um dos muitos tipos de-ponteiro inteligente disponíveis em bibliotecas como boost e loki .

Outras dicas

Para ser mais papista que o Papa (ou neste caso, Steve Guidi) os requisitos para objetos armazenados em recipientes STL é que eles são copy-construível e atribuível e uma classe abstrata não é nem. Portanto, neste caso um recipiente de ponteiros é o caminho a percorrer. Outra coisa a considerar no caso de você decidir para consertar as coisas por não fazer a classe abstrata seria corte .

std :: vector (e toda a STL em geral) é projetado para armazenar valores. Se você tem uma classe abstrata, você não intenção de manipular o valor deste tipo, mas para manipular ponteiro ou referências a ele. Então, tem um std :: vector de classe abstrata não faz sentido. E mesmo que não é abstrato, não costumam fazer sentido para manipular classe projetado para ser classes base como valor, que normalmente deve ser noncopiable (construtor de cópia e operador de atribuição declarou privada e não implementado é o truque padrão, herdando uma classe adequada cuja finalidade solitária é fazer com que seu descendente não copiable - boost :: noncopyable por exemplo -. tornou-se fashionanle)

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