Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Массив свойств объекта

309
10 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
В общем, как-то понадобилось мне реализовать объект со множеством однотипных свойств, доступных только для чтения. Причём, сами свойства при чтении должны быть константными объектами.
Все обстоятельства, из-за которых потребовалось решать подобную задачу, перечислять очень долго. И не в этом дело......

Для этого я использовал следующий шаблон - реализация Borland C++ Builder 6
Код:
template <class T, int C> class TtProps
{
private:
T fItems [C];
protected:
inline const T& Get_Item (int Index) const
     {return fItems [Index];}
inline void T& Set_Item (int Index, const T &Value) const
     {fItems [Index] = Value;}
public:
virtual __fastcall ~TtProps (void) {}
};
// Пример конкретной реализации
class TcMyProps: public TtProps <int, 2>
{
enum TeItems // Перечисление именованых констант для свойств
     {itmProp1 = 0, itmProp2};
public:
 __property int Prop1 = {read = Get_Item, write = Set_Item, index = itmProp1;}
 __property int Prop2 = {read = Get_Item, write = Set_Item, index = itmProp2;}
};


Вопрос в чём, насколько медленее будет работать данная реализация по сравнению с обычной структурой с открытыми полями, при условии, что функции чтения/записи являются встроенными, а их параметры - предопределёнными ещё на этапе компиляции.

Желательно, с ассемблерными кодами :)
261
10 ноября 2006 года
ahilles
1.5K / / 03.11.2005
ассемблер ничего не даст надо шарить во внутреннем устройстве объектов С++
3
10 ноября 2006 года
Green
4.8K / / 20.01.2000
Надо просто написать нормальный, красивый код, а не такую (прости за резкость) крякозябру.
А лучше сначала хорошенько обдумать задачу, а потом уж изобретать.
Т.к. не понятно, что значит "множество однотипных свойств".

Кроме того, советую не пользоваться приблудой Borland-а __property, не вписывается она в парадигму С++.
1.9K
11 ноября 2006 года
[*]Frosty
278 / / 17.06.2006
2 el scorpio:
Так как ты используешь inline, то скорее всего с такой же скоростью
309
15 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
Упс, еле нашёл тему, перенесли :(. Хотя размещая тему в раздел "низкоуровневое программирование", я ожидал получать ответы с комплектом ассемблерных листингов для разных типов.... Эх, проехали.


Цитата:
А лучше сначала хорошенько обдумать задачу, а потом уж изобретать.
Т.к. не понятно, что значит "множество однотипных свойств".


Под "множеством однотипных свойств" я подразумеваю именно это самое: 5, 10, .... полей одного (любого) типа.
А задача может быть простой: десяток, два подобных структур, для каждой из которых требуется стандартный набор действий - это не только генерируемое "по умолчанию" присваивание, но и "обнуление", а также сравнение. Стоит условие такой задачи решения ;)?
Первое можно сделать простым присваиванием значения "нулевого" константного объекта (требует объявление для каждого типа и накладно)
А вот второго без написания operator == много-много раз, не обойдёшься :(

Зато можно один раз в шаблоне реализовать два/три цикла (по одному на каждый метод), и клепать структуры, как на конвейере - только успевай имена для свойств придумывать.

3
15 ноября 2006 года
Green
4.8K / / 20.01.2000
Сама по себе поставленная тобой задача следует из направильного подхода.
Если свойства однотипные, то это скорее всего коллекция, т.е. набор однотипных элементов. Реализаций коллекций существует множество.
547
16 ноября 2006 года
Hydra
488 / / 20.06.2006
2el scorpio
Имхо, потери в скорости будут незначительны и удобство использования их окупит.
А потери будут, в частности, из-за вызовов функций Get/Set
3
16 ноября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=Hydra]2el scorpio
Имхо, потери в скорости будут незначительны и удобство использования их окупит.
А потери будут, в частности, из-за вызовов функций Get/Set[/QUOTE]
Не будет потерь на Get/Set, т.к. они inline.
Кстати, писать inline для метода определяемого в определении класса не обязательно, он и так в этом случае уже inline.
309
16 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Green]Сама по себе поставленная тобой задача следует из направильного подхода.
Если свойства однотипные, то это скорее всего коллекция, т.е. набор однотипных элементов. Реализаций коллекций существует множество.[/QUOTE]
В принципе, расширив описание шаблона до template <class Ta, int Ca, class Tb int Cb, ...........> можно сделать и несколько типов свойств. Хотя, мысль, конечно, можно откомментировать весьма разными словами.
А в С++ есть "коллекции"? Как называются классы/типы их реализаций?

Кроме того, можно создать производный шаблон для выполнения таких действий, как чтение/запись объекта для множества источников данных (файл, компонент СУБД.....)
3
16 ноября 2006 года
Green
4.8K / / 20.01.2000
Коллекции есть, для их хранения используют различного вида контейнеры: vector, map, list и т.д.

Такое впечатление, что ты просто подойдя несколько с другой стороны и сам того не осознавая, просто, пытаешься создать свой контейнер. :)
1.9K
16 ноября 2006 года
[*]Frosty
278 / / 17.06.2006
Мне кажеться, что в данном случае map подойдет, где первый элемент пары - имя свойства.
Что-то вроде:
Код:
[COLOR="SeaGreen"]#include <map.h>
#include <string.h>[/COLOR]
//...

template <class T>
class TtProps
{
  //...
  map<string, T> properties;
public:
  inline T& operator[](string name)
  {
    return properties[name];
  }
  //...
};
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог