Код
#ifndef HEADER_H__
#define HEADER_H__
class a
{
...
class b
{
...
};
};
#endif // HEADER_H__
#define HEADER_H__
class a
{
...
class b
{
...
};
};
#endif // HEADER_H__
Сами классы довольно большие (в экран не влезают), плюс еще inline-функции, в общем файл получился большой. Ненавижу листать большие файлы, поэтому появилось желание разбить его на несколько:
Код
#ifndef HEADER_A_H__
#define HEADER_A_H__
class a
{
...
class b;
};
#include "header_b.h"
.... // тут идут определения встраиваемых функций-членов класса a, которым нужно знать о внутреннем устройстве класса b
#endif // HEADER_A_H__
=================================
#ifndef HEADER_B_H__
#define HEADER_B_H__
class a::b
{
...
};
#endif // HEADER_B_H__
#define HEADER_A_H__
class a
{
...
class b;
};
#include "header_b.h"
.... // тут идут определения встраиваемых функций-членов класса a, которым нужно знать о внутреннем устройстве класса b
#endif // HEADER_A_H__
=================================
#ifndef HEADER_B_H__
#define HEADER_B_H__
class a::b
{
...
};
#endif // HEADER_B_H__
Но в этом случае header_b.h сам по себе интереса не представляет, его можно включать в исходник только через header_a.h
Для вменяемой диагностики неправильного включения обычно применяется такой метод:
Код
#ifndef HEADER_B_H__
#define HEADER_B_H__
#ifndef HEADER_A_H__
#error "Include header_a.h instead of this file"
#endif
class a::b
{
...
};
#endif // HEADER_B_H__
Вроде все работает правильно, но не нравится мне один момент: в файле исходника, в котором определены невстраиваемые функции-члены класса a::b вместо логичного #include "header_b.h" придется включать header_a.h#define HEADER_B_H__
#ifndef HEADER_A_H__
#error "Include header_a.h instead of this file"
#endif
class a::b
{
...
};
#endif // HEADER_B_H__
Скорее всего я изобрел велосипед, но в header_b.h сделал так:
Код
#include "header_a.h"
#ifndef HEADER_B_H__
#define HEADER_B_H__
class a::b
{
...
};
#endif // HEADER_B_H__
#ifndef HEADER_B_H__
#define HEADER_B_H__
class a::b
{
...
};
#endif // HEADER_B_H__
Теперь я могу включать в любое нужное место как header_a.h, так и header_b.h и вместо сообщения об ошибке все будет корректно собираться, хотя тут есть рекурсия включений.
На мой взгляд все выглядит красиво, но возможно я не вижу каких-то подводных камней? Ваше мнение - имеет такой велосипед право на жизнь? Или может есть другие, еще более красивые решения?