реклама на сайте
подробности

 
 
> Разбивка большого заголовочного файла на несколько, покритикуйте решение
Сергей Борщ
сообщение Feb 19 2015, 09:45
Сообщение #1


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Задача: есть некий большой заголовочный файл. Ну например:
Код
#ifndef 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__

Но в этом случае 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

Скорее всего я изобрел велосипед, но в header_b.h сделал так:
Код
#include "header_a.h"
#ifndef HEADER_B_H__
#define HEADER_B_H__

class a::b
{
...
};
#endif // HEADER_B_H__

Теперь я могу включать в любое нужное место как header_a.h, так и header_b.h и вместо сообщения об ошибке все будет корректно собираться, хотя тут есть рекурсия включений.

На мой взгляд все выглядит красиво, но возможно я не вижу каких-то подводных камней? Ваше мнение - имеет такой велосипед право на жизнь? Или может есть другие, еще более красивые решения?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 00:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016