programacion poo modo hijo herencia ejemplos derivadas clases clase c++ windows exception dll dllexport

c++ - poo - herencia en java ejemplos



Cómo dllexportar una clase derivada de std:: runtime_error? (1)

He configurado una biblioteca que proporciona una clase de excepción derivada de la excepción estándar:

#include <stdexcept> #include <string> class BaseException : public std::runtime_error { public: BaseException( std::string const & msg ); };

Hasta aquí todo bien. Compila y maneja bastante bien en Unix. Ahora estoy preparando esto para la compilación en una DLL de Windows:

#ifdef WIN32 #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif #include <stdexcept> #include <string> class MY_EXPORT BaseException : public std::runtime_error { public: BaseException( std::string const & msg ); };

Sin embargo, esto me da una advertencia C4275 : non – DLL-interface class ''std::runtime_error'' used as base for DLL-interface class ''BaseException'' usa la non – DLL-interface class ''std::runtime_error'' used as base for DLL-interface class ''BaseException'' .

Y desafortunadamente, soy algo alérgico a la documentación al estilo de Microsoft: excesivamente prolijo, y no muy al grano. Sigue dejándome completamente confundido en cuanto a lo que se espera de mí para resolver mi problema.

¿Alguno de ustedes puede iluminarme? Podría simplemente descartar la clase base, pero luego capturar std::runtime_error o std::exception no atraparía mi clase de excepción personalizada, y preferiría que esto fuera posible. Asi que...?


Hay algunas opciones para usted en este tipo de situación.

  1. Exportarlo.
  2. Ignoralo.
  3. En línea.

Es importante tener en cuenta que la forma "correcta" de exportar clases desde una dll es exportar toda la clase, incluidas las bases y los miembros. Por esta razón, hay varias técnicas como esta en CodeProject , que usan una "interfaz" y una fábrica apropiada para crear la clase (y la destrucción correspondiente).

Esto no es demasiado útil para usted en esta situación, tratar de exportar std::runtime_error es probablemente más esfuerzo y es probable que presente problemas aún mayores más adelante.

Tomado del sitio de Microsoft Connect aquí ( webarchive ), la familia de estos errores son esencialmente ruidosos;

Recomiendo evitar esto en primer lugar: poner los tipos de STL en la interfaz de DLL te obliga a seguir las reglas de STL (específicamente, no puedes mezclar diferentes versiones principales de VC, y tus configuraciones de IDL deben coincidir). Sin embargo, hay una solución. C4251 es esencialmente ruido y puede ser silenciado ...

Stephan T. Lavavej (uno de los mantenedores de la biblioteca C ++ de Micrsoft).

Mientras las opciones del compilador sean consistentes a lo largo del proyecto, simplemente silenciar esta advertencia debería estar bien.

La última opción es definir la clase BaseException línea y no exportarla en absoluto.

En mi experiencia, la opción en línea aterrizó casi siempre siendo la más fácil para las clases de excepción.

Los cambios en el tiempo de ejecución de C ++ para VS2015 han provocado cambios en la exportación de std::exception (no se exporta desde el tiempo de ejecución).

La opción en línea ahora parece ser la más adecuada en este momento (su millaje puede variar).