Há uma maneira de declarar Construtor de cópia não-pública e usando padrão construtor de cópia?

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu tenho um não tão pequena classe em desenvolvimento (que muda frequentemente) e eu não precisa de fornecer um construtor de cópia público e copiar atribuição. A classe tem objetos com valores semânticos, então cópia padrão e atribuição de trabalho.

a classe está em uma hierarquia, com métodos virtuais, então eu fornecer um clone virtual () para evitar corte e para executar "cópia polimórfica".

Eu não quero declarar atribuição de cópia e construção protegidas e para defini-los (e manter em sincronia com as mudanças) a menos que eu tenho alguma coisa especial para executar.

Do alguém sabe se há outra maneira?

Obrigado!

UgaSofT

Foi útil?

Solução

Um objeto de uma hierarquia polimórfica, e com valores semânticos? Algo está errado aqui.

Se você realmente precisa fazer sua classe para ter um valor semântica, ter um olhar para Envolva-Letter Idiom de J.Coplien, ou neste artigo sobre objetos regulares [1].

[1] Sean Parent. “Além Objects”. Compreendendo o software que nós escrevemos. http://stlab.adobe.com/wiki/index.php/Papers_and_Presentations. As ligações C ++. Novembro 2005.

HTH,

Outras dicas

Eu não acho que haja nada na linguagem C ++ que permite que você faça isso. Embora eu adoraria estar errado quanto a este ponto.

Eu tenho que correr para isso no passado e chegar com a seguinte solução. Asumme a classe é C1.

  1. Definir uma classe interna privada chamada de dados
  2. Coloque todos os meus membros Eu delare em C1 em dados em vez
  3. Definir um construtor de cópia protegida que apenas cópias instâncias de dados entre C1.

Esta abordagem tem algumas desvantagens. Ou seja, ele se sente um acesso de campo direto pouco un-natural e elimina (pode ser mitigado com funções de acesso pequenos).

É uma forma indireta de fazer o que você está procurando, mas ele evita que você tenha que escrever o construtor de cópia à mão.

Talvez eu tenha encontrado uma solução ...

Eu posso colocar na minha classe base raiz (ou eu posso criar uma pequena classe de interface, sem membros de dados, e realizar a herança múltipla) o construtor de cópia protegida que aqui está vazio. Eu não redefinir o ctor cópia em classes derivadas, quando o padrão é ok. Agora a cópia ctor padrão não é acessível a clientes (causa a base não é acessível), mas obras padrão!

Há alguma objeção?

Se você pode usar C ++ 0x ...

class A
{
    protected:
        A(const A&) = default;
};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top