Re[3]: type_safe
От: AiratSA Россия  
Дата: 18.05.02 09:17
Оценка:
А>Полный вариант задания таков:

А>Реализовать контейнерный класс, обладающий следующими свойствами

А>1. Класс представляет собой ассоциативный контейнер, способный хранить объекты произвольных типов, используя строки или другой тип идентификатора в качестве ключей.
А>2. В одном контейнере могут храниться объекты разных типов. При этом доступ к объектам – type-safe, то есть объект класса A можно получить только как объект класса A. Получение объекта по имени(id), не зная его типа невозможно.
А>...
А>5. Элегантный интерфейс, такого образца:

А>Container C1, C2;

А>int i = 5;
А>A a;
А>B b;
А>C1[“Int”] = i;
А>C1[“Obj1”] = a;
А>C1[“Obj2”] = b;
А>C1[“Ptr”] = &a;
А>C2[“Copy”] = C1[“Obj1”];
А>A* anotherA = C1[“Ptr”];
А>B b2 = C1[“Obj2”];


Простейшее решение — использовать некий "универсальный" тип наподобие VARIANT в COM. А весь typesafe-доступ реализовывать посредством перегрузки операторов. Правда, для хранения объектов, т.е. экземпляров классов, придется помучиться, поскольку в С++ нет универсального способа создания копии объекта. Можно потребовать, чтобы все классы реализовывали функцию для копирования


class IContainerObject { // Функции, необходимые для хранения объекта в контейнере
public:
  virtual ~IContainerObject();
  virtual IContainerObject* Clone() const = 0; // Создание копии объекта
  virtual const char* GetTypeName() const = 0; // Возвращает имя типа объекта, вместо этой функции можно использовать RTTI
};

class MyClass: virtual public IContainerObject {
public:
  ...
  virtual TContainerObject* Clone() const { ... }
  ...
};


Айрат.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.