Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

258
Vistas
manejar el caso predeterminado en el constructor de c ++

Sé que se recomienda no lanzar una excepción en el constructor, pero necesito usar el cambio de caso en el constructor, me pregunto cómo debo manejar el caso predeterminado, al que en realidad no se debe acceder.

 enum LengthUnit { MILLIMETERS = 0, MICROMETERS, NANOMETERS, }; class Length { public: constexpr Length(double value, LengthUnit unit) noexcept { switch(unit) { case MILLIMETERS: mNanometers = value * 1e6; break; case MICROMETERS: mNanometers = value * 1e3; break; case NANOMETERS: mNanometers = value; break; default: { // accessed when called Length(1, LengthUnit(10)), not permitted // throw std::exception(); } } private: int mNanometers; };
  1. constexpr se usa para calcular el valor cuando se compila para aceleración
  2. noexcept está marcado para constrcutor no debería lanzar una excepción
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Su conocimiento es incorrecto. A menudo se recomienda lanzar una excepción del constructor cuando falla la construcción. La captura de excepciones suele ser lo más conveniente, pero no siempre. La conveniencia a menudo no es la razón por la que usamos C++.

Entonces, si no desea arrojar desde los constructores, debe tener algún tipo de estado "malo", "inexistente" o "mal construido" de objetos mal construidos (y, por lo tanto, almacenamiento para esos estados en objetos) y también manejar esos estados explícitamente con estilo if (length.isBad()) not capturando excepciones. Eso a menudo no se recomienda.

over 4 years ago · Santiago Trujillo Denunciar

0

Si arroja una excepción en el constructor, el destructor no se ejecutará automáticamente. Este es un problema si tiene una adquisición manual de recursos en el constructor que debe liberarse manualmente en el destructor. Pero no es un problema lanzar una excepción en el constructor si tiene objetos automáticos en la clase, responsables de adquirir/liberar recursos. Se invocarán los destructores de miembros automáticos. Si necesita la adquisición manual de recursos, cree una clase separada que administre automáticamente el recurso y utilícelo en su clase.
Una buena idea, esto ya se sugiere en los comentarios, use la clase enum, que protegerá su código en el momento de la compilación:

 enum class LengthUnit : int { MILLIMETERS = 0, MICROMETERS, NANOMETERS, };

La otra opción, si aún necesita no lanzar desde el constructor, todavía hay una forma de indicar el estado no válido del objeto. Usando una variable miembro. Pero su clase tal como está no tiene problemas para lanzar una excepción desde el constructor. También usar la variable de estado es redundante si usa enum class :

 class Length { public: Length(double value, LengthUnit unit) noexcept { switch(unit) { case LengthUnit::MILLIMETERS: mNanometers = value * 1e6; break; case LengthUnit::MICROMETERS: mNanometers = value * 1e3; break; case LengthUnit::NANOMETERS: mNanometers = value; break; default: valid = false; } } bool isValid(){return valid;} bool isInvalid(){return !valid;} private: bool valid = true; int mNanometers = 0; };
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda