Cuestión : Operador de asignación perfecto 1

¿Hola, el

How debe yo hacer a operador de asignación perfecto para esta clase?

class TAAA : TSuperAAA
{
TBBB* b1_;
   TBBB* b2_;
}; el
TBBB es monomórfico y b1_, punto something.
de b2_ class= del

Respuesta : Operador de asignación perfecto 1

>> 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:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
TAAA& TAAA:: operator= (taaa del const TAAA&) {
    TSuperAAA:: operator= (taaa);                   llamada de // el operador de asignación para la clase baja
    ¡si (esto! = &taaa) {                          comprobación para de // la asignación del uno mismo
        cancelación b1_;
        b1_ = 0;
        b1_ = nuevo TBBB (taaa.b1_);
        cancelación b2_;
        b2_ = 0;
        b2_ = nuevo TBBB (taaa.b2_);
    }
    *this de vuelta;
}
Otras soluciones  
 
programming4us programming4us