C ++ principios básicos C.42: objeto Si el constructor no puede generar legítima es lanzada

 

C.42: Si un constructor no puede construir un objeto válido, una excepción

C.42: Si el constructor no puede generar legítimo objeto será una excepción

 

 

La razón (razón)

 

 

Dejando tras de sí un objeto no válido es buscar problemas.

Los objetos no válidos izquierda a posterior procesamiento equivaldría a buscar problemas.

 

Ejemplo (Ejemplo)

 

 

 

class X2 {
    FILE* f;
    // ...
public:
    X2(const string& name)
        :f{fopen(name.c_str(), "r")}
    {
        if (!f) throw runtime_error{"could not open" + name};
        // ...
    }

    void read();      // read from f
    // ...
};

void f()
{
    X2 file {"Zeno"}; // throws if file isn't open
    file.read();      // fine
    // ...
}

 

 

 

Ejemplo, malo (muestra negativa)

 

 

 

class X3 {     // bad: the constructor leaves a non-valid object behind
    FILE* f;   // call is_valid() before any other function
    bool valid;
    // ...
public:
    X3(const string& name)
        :f{fopen(name.c_str(), "r")}, valid{false}
    {
        if (f) valid = true;
        // ...
    }

    bool is_valid() { return valid; }
    void read();   // read from f
    // ...
};

void f()
{
    X3 file {"Heraclides"};
    file.read();   // crash or bad read!
    // ...
    if (file.is_valid()) {
        file.read();
        // ...
    }
    else {
        // ... handle error ...
    }
    // ...
}

 

 

 

Nota (Nota)

 

 

Para una definición de la variable (por ejemplo, en la pila o como miembro de otro objeto) no hay ninguna llamada de función explícita de la que podría ser devuelto un código de error. Dejando atrás un objeto no válido y confiando en los usuarios para comprobar constantemente una función is_valid () antes de su uso es tedioso y propenso a errores, e ineficiente.

Las definiciones de variables (como la pila o como miembros de otros objetos) devuelve un código de error de función explícita no existe para llamar. De izquierda a procesamiento posterior y se basan en una función práctica destino no válido el usuario compruebe siempre antes de su uso por un is_valid () es tedioso y propenso a errores e ineficiente.

 

 

Excepción (excepción)

 

 

Hay dominios, tales como algunos sistemas de tiempo real duro (pensar controles avión) donde (sin soporte de herramienta adicional) manejo de excepciones no es suficientemente predecible a partir de una perspectiva de temporización. Debe usarse la técnica is_valid (). En tales casos, comprobar is_valid () consistente e inmediata a RAII Simular.

Algunas áreas, tales como los sistemas de tiempo real (como el control de la aeronave), que (si no hay soporte de herramientas adicionales) la gestión de excepciones en términos de tiempo en términos de no totalmente predecible. Aquí debe is_valid la tecnología (). En este caso, de principio a fin de comprobar is_valid () e inmediatamente imitar el comportamiento RAII.

 

1.RAII es (wiki traducida anteriormente como "Raii") Raii resumen, es un manejo de los recursos del lenguaje C ++, para evitar fugas de uso. Link: https: //github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rr-raii

2. El sistema de tiempo real no puede ejecutar el programa de terminal no puede lanzar una excepción.

 

 

 

Alternativas (otras opciones)

 

 

Si usted se siente tentado a usar un poco de "inicialización post-constructor" o "inicialización de dos etapas" modismo, trate de no hacer eso. Si realmente tiene que, vistazo a las funciones de fábrica.

Si desea utilizar las condiciones previas para una inicialización de dos etapas o de inicialización, no lo haga. Si realmente tiene que hacer eso, tenga en cuenta la función de fábrica.

 

La función de fábrica: https: //github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-factory

 

 

 

Nota (Nota)

 

 

Una de las razones la gente tiene init utilizado () funciones en lugar de hacer el trabajo de inicialización en un constructor ha sido la de constructores replication.Delegating código de inicialización y evitar miembro predeterminado hacerlo mejor. Otra razón ha sido la de inicialización de retardo hasta que un objeto es necesaria; la solución a esto es a menudo no declarar una variable hasta que pueda ser adecuadamente initialized.pa

Las personas que usan la función init () en lugar del proceso de inicialización en el constructor es para evitar la duplicación de código. Delegado y miembro de inicialización constructor por defecto se puede hacer mejor. Otra idea original de que antes de que se utiliza para inicializar el objeto es retrasar, la solución es generalmente esperar hasta que se declara las variables se pueden inicializar correctamente.

 

Delegado constructor: https: //github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-delegating

 

 

 

Cumplimiento (Sugerencias)

 

 

???

 

Descripción del enlace

 

 

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c42-if-a-constructor-cannot-construct-a-valid-object-throw-an-exception

 


 

Creo que este artículo útil? pulgares de bienvenida ya compartir con más personas.

Leer artículos más actualizados, por favor preste atención a las micro-canal número público de pensamiento orientado a objetos []

Publicados 408 artículos originales · ganado elogios 653 · vistas 290 000 +

Supongo que te gusta

Origin blog.csdn.net/craftsman1970/article/details/104432300
Recomendado
Clasificación