Сначала немного таксономии.
Это
class CPMT {
public:
double GetGain();
// ...
};
определяет класс без определения функций-членов.Этот
class CPMT {
public:
double GetGain() {return gain;}
// ...
};
определяет тот же класс, а также определяет встроенные функции-члены (неявно).Это
double CPMT::GetGain() {return gain;}
// ...
определяет функции-члены (не встроенные).
Теперь, если вы хотите отделить реализацию от интерфейса, ваш заголовок должен определить класс, а файл реализации должен определить его функции-члены.Таким образом, чистое определение класса
class CPMT {
public:
double GetGain();
//...
};
входит в заголовочный файл, а реализация
double CPMT::GetGain() {return gain;}
// ...
входит в файл реализации - за исключением для тех функций-членов, которые вы хотите реализовать inline .Так как inline
просит компилятор заменять реализацию функции для каждого ее вызова, реализация должна присутствовать там, где вызывается функция.Вот почему реализации встроенных функций должны быть в заголовочных файлах.
Есть два способа встроить функцию-член.Один из них - определить его в пределах определения его класса
class CPMT {
public:
double GetGain() {return gain;}
// ...
};
, что неявно делает его inline
.Другой - явно встроить его
class CPMT {
public:
double GetGain();
//...
};
inline double CPMT::GetGain() {return gain;}
// ...
В обоих случаях реализация должна находиться в заголовочном файле.