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.
- Exportarlo.
- Ignoralo.
- 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).