Criando um construtor de cópias fácil de manter
Considere a seguinte classe:
class A {
char *p;
int a, b, c, d;
public:
A(const &A);
};
Note que eu tenho que definir um construtor de cópia para fazer uma cópia profunda de "p". Isso tem dois problemas:
A maioria dos campos deve ser simplesmente copiada. Copiá-los um por um é feio e propenso a erros.
Mais importante, sempre que um novo atributo é adicionado à classe, o construtor de cópias precisa ser atualizado, o que cria um pesadelo de manutenção.
Eu pessoalmente gostaria de fazer algo como:
A(const A &a) : A(a)
{
// do deep copy of p
:::
}
Portanto, o construtor de cópia padrão é chamado primeiro e, em seguida, a cópia profunda é executada.
Infelizmente, isso não parece funcionar.
Existe alguma maneira melhor de fazer isso? Uma restrição - não posso usar ponteiros compartilhados / inteligentes.
As sugestões da Sbi fazem muito sentido. Acho que vou criar classes de wrapper para manipular o recurso. Eu não quero usar o shared_ptr, pois as bibliotecas boost podem não estar disponíveis em todas as plataformas (pelo menos não nas distribuições padrão, o OpenSolaris é um exemplo).
Eu ainda acho que teria sido ótimo se você pudesse, de alguma forma, fazer o compilador criar os operadores de construtor / atribuição padrão para você e você poderia simplesmente adicionar sua funcionalidade sobre ele. O construtor de cópias / operador de atribuição criado manualmente funciona, acho que será um aborrecimento para criar e um pesadelo para manter. Portanto, minha regra pessoal seria evitar construtores de cópias personalizadas / operadores de atribuição a todo custo.
Obrigado a todos por suas respostas e informações úteis e desculpe pelos erros de digitação na minha pergunta. Eu estava digitando no meu telefone.