Вопрос к Гуру.
Есть проект на С, достаточно объёмный, в к-м реализован (естественно на C)
аналог паттерна фабрика.
Сейчас, в связи со значительный расширением функционала возникла идея перевести код на С++,
благо архитектура очень хорошо подходит под ООП и аналог ООП на С уже реализован.
Однако есть вопрос:
Основа системы — механизм создания/удаления экземпляров разл. классов.
Есть файл, в к-м описывается, сколько, каких, в каком порядке и с какими параметрами надо создать экземпляров классов.
//заголовочник
typedef struct _UNI_FACE{
long Id;
_UNI_FACE* (*Constructor) (CCModule* pCCModule);
void (*Destructor) (_UNI_FACE* This);
} UNI_FACE;
unsigned long Id = pCCModule->ulModuleId;
long i;
long size=0;
UNI_FACE* current = NULL;
#pragma segment="CID_INIT_SEGMENT"
UNI_FACE **pointer = (UNI_FACE**)__segment_begin("CID_INIT_SEGMENT");
#pragma segment="CID_INIT_SEGMENT"
size=__segment_size("CID_INIT_SEGMENT");
size /= sizeof(UNI_FACE *); //4;
for (i = 0; i < size; i++) {
if (pointer[i]->Id == Id) {
current = pointer[i];
break;
}
}
if (!current) {
return NULL;
}
current = (UNI_FACE *)current->Constructor(pCCModule);
if (!current) {
return NULL;
}
LInsert(&configuration_head,current);
pCCModule — данные о классе и его парамерах
CID_INIT_SEGMENT — сегмент, в к-м храняться данные о имеющихся в системе типах классов.
Для каждого класса есть константная структура, указатель на к-ю и кладётся в сегмент CID_INIT_SEGMENT
UNI_FACE* ID10000_Constructor (CCModule* pCCModule);
void ID10000_Destructor (UNI_FACE* This);
const UNI_FACE ID10000_face={
ID10000,
ID10000_Constructor,
ID10000_Destructor
};
#pragma location="CID_INIT_SEGMENT"
__root void* const ID10000Point=(void*)&ID10000_face;
путем добавления/исключения соотв. .с файлов можно добавлять и удалять типы классов в системе.
Теперь проблема — рассмотрел реализации такого механизма на С++. Предлагается либо в реализации фабрики заранее задавать
switch с прямыми вызовами конструкторов соотв. классов, либо иметь массив (Id,*класс), в к-м регистрировать имеющиеся классы.
Оба подхода неприемлемы, т.к. требуют при изменении состава классов менять код фабрики (или её инициализации). Существует ли иной путь?