Мне было интересно, какие различия между объявлением и реализацией класса исключительно в файле заголовка по сравнению с обычным подходом, в котором вы протипеваете класс в заголовке и реализовать в эффективном файле .cpp.Разница между реализацией класса внутри файла .h или в .cpp-файле
Чтобы лучше объяснить, что я имею в виду, я имею в виду различия между нормальным подходом:
// File class.h
class MyClass
{
private:
//attributes
public:
void method1(...);
void method2(...);
...
};
//file class.cpp
#include "class.h"
void MyClass::method1(...)
{
//implementation
}
void MyClass::method2(...)
{
//implementation
}
и только заголовка подход:
// File class.h
class MyClass
{
private:
//attributes
public:
void method1(...)
{
//implementation
}
void method2(...)
{
//implementation
}
...
};
я могу получить основные отличия: во втором случае код включается в каждый другой файл, который нуждается в нем, генерирует больше экземпляров одних и тех же реализаций, поэтому подразумевается избыточность; в то время как в первом случае код компилируется сам по себе, а затем каждый вызов, относящийся к объекту MyClass
, связан с реализацией в class.cpp
.
Но существуют ли другие отличия? Удобнее ли использовать подход вместо другого в зависимости от ситуации? Я также где-то читал, что определение тела метода непосредственно в заголовочном файле является неявным запросом компилятору встроить этот метод, верно ли это?
Если у вас есть предохраняющие препроцессоры, он не будет создавать больше экземпляров одной и той же реализации. –
Вы говорите о #ifndef _CLASS_H_ #define _CLASS_H_ и т.д ..? – Jack
@Andrew: обязательно это будет, если два.В файлах cpp оба включают один и тот же заголовок, после чего каждый будет компилировать его содержимое в полном объеме, независимо от каких-либо препроцессорных охранников, и что скомпилированный контент будет присутствовать в выходном объектном файле. Компилятор удаляется только компоновщиком. Защитные устройства препроцессора должны грациозно обрабатывать двойное включение заголовка одной единицей перевода, а не разделять между единицами перевода. –