crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> учёт пользовательских Id типов данных
Litkevich Yuriy
  опции профиля:
сообщение 23.8.2010, 5:39
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


в Qt, а возможно и в других библиотеках, есть перечисления, описывающие тип (подтип) данных. Например:
QEvent — объект-событие, позволяет создавать наследников. В этом классе определено перечисление enum QEvent::Type. в котором есть значение QEvent::User. При создании наследника нужно определить собственный тип, следующим образом:
enum { Type = UserType + 1 };
int type() const
{
     return Type;
}
здесь единичка только для примера. Когда создаются несколько пользовательских типов, то у каждого должно быть своё смещение.

Вопрос: какие способы учёта идентификатор пользовательских типов вы используете/знаете?
На мой взгляд эта проблема стоит довольно остро в приложениях с развитым использованием подключаемых модулей (plugins)


П.С.
применительно к QEvent я знаю о существовании метода
int QEvent::registerEventType ( int hint = -1 )   [static]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 23.8.2010, 6:11
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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

если всё очень глобально, то лучше GUID применить для идентификации )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.8.2010, 6:31
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Алексей1153 @ 23.8.2010, 10:11) *
то лучше GUID применить для идентификации )
не получится, это ограничение базового класса, он уже предоставляет константу UserType и виртуальную функцию type()

Цитата(Алексей1153 @ 23.8.2010, 10:11) *
он ведь актуален только для одного-трёх приложений
если бы, если строить приложения модульно, то модули можно повторно использовать.

Ещё один пример - QGraphicsItem (про его UserType на форуме уже всплывала тема.)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 23.8.2010, 6:39
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Может быть, я просто суть проблемы не понял. А пример косяка можно ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.8.2010, 7:31
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Алексей1153 @ 23.8.2010, 10:39) *
А пример косяка можно ?
есть два стандартных (со временем таковыми стали) модуля, которые определяют тип UserType + 1, и вот сошлись они в одной программе. Во время выполнения получим что-нибудь жуткое
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 23.8.2010, 7:44
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Ну, так то оно всё так. Но как два модуля могут войти в конфликт, если у них эти типы не запрашивать ? Это обязательно ?

Как вариант - если это исходный код, то выделить в namespace какой-то модуль

Сообщение отредактировал Алексей1153 - 23.8.2010, 7:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 23.8.2010, 8:05
Сообщение #7


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Litkevich Yuriy)
есть два стандартных (со временем таковыми стали) модуля, которые определяют тип UserType + 1, и вот сошлись они в одной программе. Во время выполнения получим что-нибудь жуткое
Тут видимо ничего не поделать. Придётся смириться и проектировать с учетом этой особенности.

Хотя, с другой стороны, знание смещений тебе не нужно. Главное чтобы они не пересекались. Можно сделать класс, который последовательно выдавал номера для этих типов. Минус здесь - это появление новых зависимостей.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 23.8.2010, 8:54
Сообщение #8


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


если модули наследники одного базового класса. то можно сделать регистрацию нового типа (как в QEvent) registerType()(в ней наращивать статическую переменную класса) и функцию которая возвращает текущий последний номер.
при создании наследника в конструкторе присваивать переменной type наследника последний номер + 1 и заново наращивать счетчик.
получается без лишних зависимостей
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.8.2010, 9:19
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 23.8.2010, 12:05) *
Можно сделать класс, который последовательно выдавал номера для этих типов.
Цитата(kwisp @ 23.8.2010, 12:54) *
то можно сделать регистрацию нового типа (как в QEvent) registerType()(в ней наращивать статическую переменную класса) и функцию которая возвращает текущий последний номер.
вот вроде выход из положения, но на примере того же QEvent::registerType() вроде всё гладко.
А вот в случае, например, с QGraphicsItem уже не очень гладко, т.к. у него нет такой функции, значит нужно её "где-то" реализовать.
А где это "где-то" должно находится?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 23.8.2010, 9:27
Сообщение #10


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Litkevich Yuriy,
хм. ну как вариант подмешать свойство с помощью наследования.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.4.2024, 17:05