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 []