¿Hay alguna manera de declarar que Copy Constructor no sea público Y que use Copy Constructor predeterminado?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Tengo una clase no tan pequeña en desarrollo (que cambia a menudo) y no necesito proporcionar un constructor de copia pública y una asignación de copia. La clase tiene objetos con semántica de valor, por lo que el trabajo predeterminado de copia y asignación.

la clase está en una jerarquía, con métodos virtuales, por lo que proporciono un Clone virtual () para evitar el corte y realizar una "copia polimórfica".

No quiero declarar la asignación de copias y la construcción protegidas Y para definirlas (y mantener la sincronización con los cambios) a menos que tenga algo especial que realizar.

¿Alguien sabe si hay otra manera?

¡gracias!

UgaSofT

¿Fue útil?

Solución

¿Un objeto de una jerarquía polimórfica y con semántica de valor? Algo está mal aquí.

Si realmente necesita que su clase tenga una semántica de valor, eche un vistazo al Idioma de letras envolventes de J.Coplien o a este artículo sobre Objetos regulares [1].

[1] Sean Parent. & # 8220; Más allá de los objetos & # 8221 ;. Comprender el software que escribimos. http://stlab.adobe.com/wiki/index.php/Papers_and_Presentations. Conexiones C ++. Nov 2005.

HTH,

Otros consejos

No creo que haya nada en el lenguaje C ++ que le permita hacer esto. Aunque me encantaría estar equivocado en este punto.

Me he encontrado con esto en el pasado y se me ocurrió la siguiente solución. Asumme la clase es C1.

  1. Definir una clase interna privada llamada Datos
  2. Ponga todos mis miembros que retrasaría en C1 en Datos en su lugar
  3. Defina un constructor de copia protegida que solo copie instancias de datos entre C1.

Este enfoque tiene un par de inconvenientes. Es decir, se siente un poco poco natural y elimina el acceso directo al campo (puede mitigarse con pequeñas funciones de acceso).

Es una forma indirecta de hacer lo que está buscando, pero evita que tenga que escribir el constructor de copias a mano.

Tal vez he encontrado una solución ...

Puedo poner en mi clase base raíz (o puedo crear una pequeña clase de interfaz, sin miembros de datos, y realizar una herencia múltiple) el constructor de copia protegida que aquí está vacío. No redefinir el Copiar ctor en clases derivadas, cuando el predeterminado está bien. Ahora la copia predeterminada no está accesible para los clientes (porque la base no es accesible) ¡pero la predeterminada funciona!

¿Hay alguna objeción?

Si puede usar C ++ 0x ...

class A
{
    protected:
        A(const A&) = default;
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top