Pregunta

Me preguntaba qué ocurriría un error como este.

no matching function for call to 'Foo::Foo()'

en el código de un constructor de copia? Supongamos Foo es sólo un objeto con campos normales (sin memoria asignada dinámicamente, etc.), y el único constructor se ha definido es un constructor que toma un argumento.

Yo ni siquiera sabía que el constructor necesario para ser considerado sin embargo. Si el código dice algo así como

bar = thing.bar; //

y la barra es de tipo Foo, con las especificaciones descritas anteriormente, no debe simplemente generar una copia superficial y puede hacer con ella? ¿Por qué necesita para ser invocado un constructor por defecto?

¿Fue útil?

Solución

Si no se define un constructor, el compilador generará un constructor por defecto, sin embargo si DO Definir un constructor (Al igual que un constructor de copia) el compilador no generar el constructor por defecto, por lo que es necesario definir ese constructor también.

Otros consejos

Parece que haya definido el constructor de copia sin definir cualquier otro constructor.

Una vez que se declara un constructor de forma explícita, el compilador ya no proporciona un constructor por defecto para usted. En consecuencia, ya no tiene un mecanismo para construir un objeto de la clase en el primer lugar (y por lo tanto no sería capaz de copiarlo).

Si, como usted dice, que está haciendo "algo así como

bar = thing.bar;

es presumiblemente en el cuerpo de copia ctor de su clase - por lo que el campo bar se inicializa con Héctor por defecto de su clase en primer lugar, a continuación, utiliza el operador de asignación de esa clase por esta declaración. Si la clase de bar sólo tiene un ctor copia, sin ctor defecto, se tendrá que añadir una cláusula bar(thing.bar) antes de { apertura copia ctor de su clase y eliminar esa asignación (generalmente una buena idea de todos modos, pero obligatoria en virtud el "no ctor por defecto" condición).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top