Я разрабатываю довольно большую библиотеку поддержки C ++ и обнаружил, что двигаюсь к подходу, основанному только на заголовках. В C ++ это почти работает, потому что вы можете реализовать там, где вы определяете, в классах. Для шаблонных методов реализация в любом случае должна быть в том же файле, поэтому я считаю, что намного проще просто сохранить реализацию с определением.
Однако в некоторых случаях необходимо использовать «источники». В качестве всего лишь одного примера, иногда возникают циклические зависимости, и реализация должна быть написана вне определения класса. Вот как я с этим справляюсь:
//part of libfoo.h
class Bar
{
void CircularDependency(void);
};
#ifdef LIBFOO_COMPILE_INLINE
void Bar::CircularDependency(void)
{
//...
}
#endif
Тогда проект, использующий libfoo, сделает в main.cpp следующее:
//main.cpp
#define LIBFOO_COMPILE_INLINE
#include "libfoo.h"
И в любом другом .cpp:
//other.cpp
#include "libfoo.h"
Дело в том, что секция compile-inline компилируется только один раз (в main.cpp).
И, наконец, мой вопрос: есть ли название для этой идиомы или каких-либо других проектов, которые работают таким образом? Это просто кажется естественным результатом того, что реализация и определение размыты шаблонными методами и методами классов. И: есть ли причины, по которым это плохая идея или почему она потенциально плохо масштабируется?
Небольшое отступление: я знаю, что многие программисты, не без оснований, предпочитают, чтобы их заголовки напоминали интерфейсы, а не реализации, но генераторы документации IMHO лучше подходят для описания интерфейсов, потому что мне нравится скрывать частные члены все вместе: -) em>