Duplicar posible:
Inline functions in C++¿Qué sucede si implemento una clase en el archivo de encabezado?
¿Qué hacer si el compilador implemento completamente una clase en su archivo de cabecera? Un ejemplo típico sigue:
class MyException
{
public:
explicit MyException(const char* file, int line) file(file), line(line) {};
const char* getFile() const { return file };
int getLine() const { return line };
private:
const char* const file;
const int line;
};
Mi intención es utilizar la clase como esta: throw MyException(__FILE__, __LINE__)
.
Incluyo este archivo de encabezado en cada archivo .cpp. Supongo que el compilador compilará la clase tantas veces como esté definida e incluirá el código máquina (idéntico) en cada archivo de objeto que produzca. Ahora, ¿qué hará el enlazador? Intenté un ejemplo más simple (sin todos esos molestos const
) y compiló bien.
¿Qué pasaría si, en lugar de una clase simple, implementara una función C de tres pantallas en un archivo de cabecera? Y la pregunta final, ¿debería dividir mi ejemplo en archivos .h y .cpp?
Los métodos implementados en la definición de clase están en línea. –
Para una clase corta como esta, no tiene sentido dividirla en .h y .cpp. – alfa
Funcionará bien, siempre que no incluya su excepción en 2 bibliotecas y ejecute esta excepción a través de los límites de la biblioteca en un sistema Linux. El tiempo de ejecución considerará la versión 2 de la excepción como diferente y una captura (MyException &) en la biblioteca A podría no funcionar para un throw MyException de la biblioteca B – gastush