Здравствуйте,
Есть некая реализация штуковины System из предметной области. Она включает несколько подсистем:
//заголовок system.h
class Subsystem1;
class Subsystem2;
class Subsystem3;
class System
{
Subsystem1* _s1;
Subsystem2* _s1;
Subsystem2* _s2;
public:
System();
~System();
//интерфейс System
void some_method();
//часть методов используется только subsystem1
void used_only_by_subsystem1();
//часть методов используется только subsystem2
void used_only_by_subsystem2();
};
//реализация методов system.cpp
#include "system.h"
#include "subsystem1.h"
#include "subsystem2.h"
//etc...
System::System()
{
//создаем подсистему
_s1 = new Subsystem1; //аналогично для Subsystem1, Subsystem2, ...
}
void System::some_method()
{
//используем ее
_s1->some_method();
}
System::~System()
{
//убираем за собой
delete _s1;
}
//заголовочный файл subsystem1.h
class System;
class Subsystem1
{
System* _owner;
public:
Subsystem1(System* o);
void some_method();
};
//реализация методов - файл subsystem1.cpp
#include "subsystem1.h"
#include "system.h"
Subsystem1::Subsystem1(System* o):_owner(o){}
void Subsystem1::some_method()
{
//...
//иногда приходится что-то делать с владельцем
_owner->used_only_by_subsystem1();
}
Получается, что:
1.заголовочные файлы, описывающие подсистемы не включаются в system.h (это хорошо, так как подсистемы — деталь реализации)
2. заголовочный файл системы не включается в заголовочный файл подсистемы (это тоже хорошо, так как интерфейс подсистемы не зависит от системы)
Хотелось бы, сохраняя свойства 1 и 2, как-то убрать методы used_by_subsyst из public секции описания класса System потому что они только замусоривают интерфейс системы,
а по факту используются только при ее реализации. Как этого добиться проще всего не теряя скорости выполнения?