Соглашение о разделении прототипов (то есть объявление класса, его функций, их типов) от реализации происходит как с точки зрения дизайна, так и с точки зрения производительности.
Тип проверки и составления ваших иждивенцев дешевле. Что-то, что использует ваш класс, можно безопасно скомпилировать, не зная о вашей реализации.
Ваш компилятор не будет разбирать и перекомпилировать одну и ту же информацию много раз каждый раз, когда вы компилируете этих иждивенцев.
Дело в том, чтобы помнить, что это на самом деле означает писать #include
в верхней части файла в C++: это означает «взять все содержимое какой-либо другой файл, и поместить их здесь.» Поэтому, если вы используете класс во многих местах по всей вашей базе кода, он обрабатывается каждый раз и повторно компилируется в контексте этой единицы компиляции.
Это именно причина, почему вы должны нанесенными реализаций шаблона классов в линию в файле заголовка; компилятору требуется, чтобы повторно разбить и скомпилировать класс для каждого экземпляра экземпляра каждого экземпляра (потому что это то, о чем идет речь о шаблонах).
Чтобы ответить на ваш вопрос напрямую: * Нет, вы не получите ошибку с множественным определением. * Возможно, некоторые люди рассмотрят эту практику с дизайнерской точки зрения (другие не будут) * Вы могли бы видеть разницу в производительности (хотя это и не обязательно деградация, как я считаю - хотя я мог ошибаться), что, несмотря на вышеизложенное, все же можно быстрее скомпилировать библиотеки только для заголовков.
Возможно, избегайте делать это, если ваши реализации длинны, класс часто используется в кодовой базе и может подвергаться частым изменениям.
Для дальнейшего чтения, возможно, стоит проверить «предварительно скомпилированные заголовки».
Итак, нет ничего плохого в определении функций в заголовочном файле, как это, если функции невелики? – starkk92
@ starkk92 Я согласен с этим, но это стиль, поэтому другие люди могут не согласиться. – john
Поскольку в вопросе не упоминается 'inline', вы можете сделать различие между * inline * и' inline' более понятным. –