У меня есть приложение, в котором есть несколько объектов (на данный момент около 50, но оно растет). В приложении имеется только один экземпляр каждого из этих объектов, и эти экземпляры становятся общими для компонентов.
Я извлек все объекты из базового класса BrokeredObject:
class BrokeredObject
{
virtual int GetInterfaceId() = 0;
};
И каждый тип объекта возвращает уникальный идентификатор. Эти идентификаторы хранятся в заголовочном файле.
У меня тогда есть "фабрика" ObjectBroker. Когда кому-то нужен объект, вызывайте GetObjectByID (). Бокер просматривает список STL, чтобы увидеть, существует ли объект, если он существует, он возвращает его. Если нет, он создает его, помещает в список и возвращает его. Все хорошо.
BrokeredObject *GetObjectByID(int id)
{
BrokeredObject *pObject;
ObjectMap::iterator = m_objectList.find(id);
// etc.
if(found) return pObject;
// not found, so create
switch(id)
{
case 0: pObject = new TypeA; break;
case 1: pObject = new TypeB; break;
// etc.
// I loathe this list
}
// add it to the list
return pObject;
}
Что мне кажется болезненным, так это поддержание этого списка идентификаторов и необходимость того, чтобы каждый класс его реализовывал. По крайней мере, я немного облегчил жизнь своим потребителям, так как каждый тип хранит информацию о своем собственном идентификаторе, например:
class TypeA : public BrokeredObject
{
static int get_InterfaceID() { return IID_TYPEA; }
int GetInterfaceID() { return get_InterfaceID(); }
};
Так что я могу получить такой объект:
GetObjectByID(TypeA::get_InterfaceID());
Нам нужно знать, что такое отображение идентификаторов, но я все еще не в восторге от обслуживания и возможности ошибок. Кажется, что если я знаю тип, зачем мне также знать идентификатор?
То, к чему я стремлюсь, примерно такое в C #:
BrokeredObject GetOrCreateObject<T>() where T : BrokeredObject
{
return new T();
}
Где ObjectBroker будет создавать объект на основе переданного типа .
Испортил ли меня C #, и это просто факт жизни, что C ++ не может этого сделать или есть способ добиться этого, которого я не вижу?