Разница между файлами .h, .hpp, .cpp в PCL

Я не понимаю разницы между файлами .h, .hpp и .cpp в библиотеке облаков точек. Вот пример с двусторонним фильтром, говорят что:

  • include/pcl/filters/bilateral.h — будут содержать все определения;
  • include/pcl/filters/impl/bilateral.hpp — будет содержать шаблонные реализации;
  • src/bilateral.cpp — будет содержать явные экземпляры шаблона.

Я понимаю общую концепцию заголовочного файла и реализации, но почему существует два заголовочных файла? В чем разница между реализацией шаблона и явным созданием экземпляра шаблона?

В данный момент я работаю с классом Kmeans, и .hpp не используется, вместо этого у них просто есть реализация в .cpp и включают файл .h. Почему? Более того, в файле kmeans.h они дают реализацию некоторых публичных функций-членов, а не только сеттеров и геттеров. Я не могу найти обоснование этого кода.

Спасибо!


person ricber    schedule 02.07.2019    source источник
comment
сразу после того, что вы цитируете, у них есть подробный пример того, что находится в файлах .h .hpp и .cpp. Вы это читали? Пожалуйста, обратитесь к этому также и постарайтесь лучше объяснить то, что вы не понимаете. В настоящее время у меня возникает соблазн просто опубликовать текст, следующий за вашей цитатой, в качестве ответа...   -  person 463035818_is_not_a_number    schedule 02.07.2019
comment
определения шаблонов не могут идти в исходный код, но все же иногда лучше держать их отдельно от объявлений, я думаю, что это все, что нужно объяснить. См. здесь stackoverflow.com/questions/495021/   -  person 463035818_is_not_a_number    schedule 02.07.2019
comment
возможно, дубликат: stackoverflow.com/questions/495021/   -  person 463035818_is_not_a_number    schedule 02.07.2019
comment
класс, на который вы смотрите (kmeans), не является шаблоном, поэтому нет необходимости в .hpp   -  person 463035818_is_not_a_number    schedule 02.07.2019
comment
@formerlyknownas_463035818 спасибо, ваш последний комментарий прояснил мое замешательство. Извините за мой вопрос, чтобы быть немного глупым, но я новичок в C++.   -  person ricber    schedule 02.07.2019
comment
не нужно извиняться, мы все с чего-то начинали. В С++ так много темных уголков, и почти каждый день я нахожу вещи, которые меня озадачивают.   -  person 463035818_is_not_a_number    schedule 02.07.2019
comment
Я также должен отметить, что вся кодовая база для PCL была написана многими людьми, и в самом начале не было процесса проверки кода. Модуль ml, из которого взят KMeans, является одним из наиболее экспериментальных в библиотеке, поэтому не удивляйтесь, если обнаружите ситуации, нарушающие соглашение, установленное в руководствах.   -  person Sérgio Agostinho    schedule 04.07.2019


Ответы (1)


Учтите, что только .h является заголовочным файлом, который содержит определения и который вы должны включить.

Реализации находятся как в файлах hpp, так и в файлах cpp.

  • hpp: содержит общие шаблоны template<class T>,
  • cpp: содержит не шаблонные функции или явные экземпляры template<pcl::PointXYZ>

Оба файла .h и .hpp можно объединить в один файл, но понятнее их разделить.

person Daniel GL    schedule 02.07.2019