>> especialmente cuando Infinity08: escribió que la garantía no está necesitada en sistema verdadero (si entendía).
No, no signifiqué que una garantía no es necesaria. Qué dije en respuesta al poste del ambiente era que prefiero el ocuparme de condiciones de error diferentemente que su acercamiento.
Hay dos acercamientos aquí (he agregado mis propios pensamientos personales también):
(a) Intentar escribir al operador de asignación para dejar el objeto en un estado válido para cada panorama posible. Esto es básicamente imposible, o extremadamente difícilmente por lo menos. Hay demasiadas variables implicadas, y demasiado panorama posible del error. Additionaly, esta clase de acercamiento agrega restricciones a lo que puede hacer el código, que no es deseable en muchos casos.
(b) Evitar la complejidad agregada que viene con el acercamiento anterior, y en lugar de otro diferir la responsabilidad al código de llamada. El mecanismo de excepciones se adapta perfectamente para ése. Además, es generalmente el código de llamada que sabe mejor cómo ocuparse de un error (cualquiera intentando fijarlo, no hacer caso de él, fallar agraciado, del etc.), de modo que sea otra razón para preferir este acercamiento.
El segundo acercamiento es lo que recomiendo para el caso general, porque es más flexible, y más fácil ejecutar, y cuando está hecho correctamente, usted no pierde cualquier cosa en lo que respecta a seguridad del código.
El primer acercamiento es útil en ciertos casos específicos, pero usted conseguirá rápidamente enterrado en complejidades si usted intenta utilizarlo por todas partes heh.
>> Mi inspiración para hacer este poste es
Es un artículo agradable, y cubre de hecho muchas de las trampas con los operadores de asignación.
>> I y se preguntaba cuál es respuesta correcta para eso.
Usted observará que el artículo comienza con una de las maneras correctas de acercarse a un operador de asignación. La única diferencia con el código que fijé anterior, soy que su operador de asignación limpia correctamente después de sí mismo en caso de que la asignación de memoria falle.
Eso es bueno, pero no enteramente necesario. El destructor de las clases se diseña para limpiar un objeto, así que prefiero dejar esa responsabilidad allí, en vez de separarla hacia fuera all over los métodos de las clases.
Hacia el extremo del artículo, diversos acercamientos se discuten también.
Pasando mi código anterior otra vez, manché un error sin embargo. La “cancelación b1_; la” línea se debe haber seguido por “b1_ = 0; ” línea (semejantemente para b2_). Parezco mecanografiaba un heh demasiado rápido del pedacito. Así pues, se convierte: