Чтобы программа на C ++ использовала класс C ++, требуется объявление. Если класс наследует от базовых классов, то эти объявления требуются для обработки этого класса. Это применяется рекурсивно: требуется все дерево наследования класса.
Если граф наследования настолько глубок и широк (возможно, из-за множественного наследования), что проект решит, что он неприемлем, то его необходимо реструктурировать , Классы могут использовать агрегацию вместо наследования. Таким образом, вместо:
#include <widget.h>
class foo : public widget { ... };
это может быть возможно;
class widget; // "forward" declaration only; no #include needed
class foo { widget *pwidget; ...}
Теперь, только файл, который реализует foo
, нуждается в полном объявлении widget
; клиенты foo
, включая "foo.h"
, не нуждаются в этом.
Но теперь foo
уже не является своего рода widget
, что влияет на организацию кода. foo
по-прежнему содержит widget
частей путем создания объекта и его удержания. Если widget
соответствует некоторому абстрактному интерфейсу для виджетов, foo
может реализовать это и делегировать содержащемуся widget
.
Другим инструментом минимизации зависимостей является инверсия зависимостей .