Пока я читал принятый ответ на этот вопрос , у меня был следующий вопрос:
Как правило, методы определяются в заголовочных файлах (.hpp
или что-то еще), а реализация в исходных файлах (.cpp
или что-то еще).
Одна из основных причин, по которой когда-либо включать «исходный файл» (#include <source_file.cpp>
) является плохой практикой, заключается в том, что реализация его методов будет дублирована, что приведет к ошибкам компоновки.
Когда пишут:
#ifndef BRITNEYSPEARS_HPP
#define BRITNEYSPEARS_HPP
class BritneySpears
{
public:
BritneySpears() {}; // Here the constructor has implementation.
};
#endif /* BRITNEYSPEARS_HPP */
Он дает реализацию конструктора (здесь "пустую" реализацию, но все же).
Но почему при многократном включении этого заголовочного файла (иначе говоря, в разных исходных файлах) не генерирует ошибку «дублированного определения» во время соединения?