Тема: Как при чтении класса из файла не перечислять все возможные варианты?

Здравствуйте,
есть 15 (например) разновидностей соединения двух деталей, все соединения наследуются от одного класса, все объекты работают с ними через интерфейс базового класса. Структура следующая:
class < сборка > {
public:
private:
  ...
  < соединение > * < экз.соед. >;
} ;
При сохранении сборки (dwgOutFields) вызывается метод < экз.соед. > -> dwgOutFields (...) ; Этот метод пишет в файл идентификатор, который потом будет в первую очередь читаться, чтобы по нему восстановить клас объекта.
Существует ли какой-нибудь прием, вообще или в ObjectArx  в частости, чтобы при чтении класса из файла не перечислять тупо все возможные варианты:
short a;
pFiler -> readInt16 (&a) ;
// прочитали код класса, дальше его анализируем и создаем соответсвующий экземпляр
switch (a) {
case 1: createObject1();break;
.
.
.
case 15:createObject15 (); break;
}
может быть паттерн какой есть специальный или еще что-нибудь,
Большое спасибо

Re: Как при чтении класса из файла не перечислять все возможные варианты?

ну есть конечно такой паттерн.
1) Во первых заводишь синглетон указатель на Factory
Object* pNewObject = createObject(classDesc);
2) Понятно что только при действии (1) - switch плавно перетекает из dwgIn/Out в фабрику. Может этого уже и будет достаточно? Если у тебя много объектов <сборка>, то это уже вместо N switch-ей получаем 1 switch.
3) Если разные типы соединений распиханы по разным arx-ам, то можно воспользоваться техникой регистряции классов (аля arxClassHierarchy - надо объяснять как у них это реализовано?)
4) Если каждое соединение должно писаться/читаться вмести со своим объектом  <сборка>, то ничего не мешает сделать каждому классу соединения свой dwgIn/dwgOut тогда...
short classDesc;
pFiler -> readInt16 (&classDesc) ;
// прочитали код класса, дальше его анализируем и создаем соответсвующий экземпляр
LinkObjectBase* pLink = pFactory->createLink(classDesc);
pLink->dwgIn(dwgFiller);
короче че-то типа того...

Re: Как при чтении класса из файла не перечислять все возможные варианты?

> alexeew
Такие проблемы решаются с помощью "фабрики объектов". Хорошое описание проблемы и готовое решение есть у Александреску.
Здесь довольно простой случай, поэтому можно примерно так:

typedef MyBaseClass*(*CreateFun)(void);
typedef std::map<Adesk::Int16, CreateFun> CreateFunMap;
CreateFunMap createFunMap;
MyBaseClass* LoadObject() {
    Adesk::Int16 key;
    pFiler->readInt16(&key);
    CreateFunMap::const_iterator it = createFunMap.find(key);
    if (it != createFunMap.end()) return (it->second)();
    else throw std::runtime_error("неизвестный тип")
}

Re: Как при чтении класса из файла не перечислять все возможные варианты?

АрхиМаг - я тебя ей богу уважаю (честно), но не парь человеку мозги - если он задает такие вопросы, то какие typedef-ы указателей на функции? Какой STL? Я на своих студентах давно поверил, что объяснять паттерны проектирования и архитектурные вопросы на шаблонах, и STL нельзя.
Еще расскажи человеку как автоматизировать заполнение createFunMap - ведь кто-то ж должен туда все это положить при старте, чтоб потом оттуда достать...
Пусть сначала из хреновой тучи switch-ей сделает один, а уже потом если понадобиться избавиться от switch-а - сделает map creator-ов. А за указатели на функции давно растрел без права оправдаться...