Russian Qt Forum
Ноябрь 25, 2024, 04:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Как создать объект с уникальным для него идентификатором?  (Прочитано 18382 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Январь 20, 2009, 13:24 »

Доброго времени всем !

Тут столкнулся с такой задачкой:

1. например при создании какого нибудь класса (оператором new) необходимо как-то его идентифицировать, т.е отличать его от других таких же классов...
2. количество создаваемых таким образом классов ограничено допустим числом в 2000 штук
3. каждый такой класс "внутри" имеет некую ЦЕЛУЮ (int) переменную id ...

идея в том, чтобы из множества созданных однотипных классов отыскать класс с нужным идентификатором - и потом с ним работать!

так вот:
1. каким образом при создании класса генерировать эту переменную ID так, чтобы однозначно она определяла этот класс (т.е не повторялась и т.п.) ?
2.  может есть какие-то стандартные методы в QT?

Записан

ArchLinux x86_64 / Win10 64 bit
spirit
Гость
« Ответ #1 : Январь 20, 2009, 13:27 »

сделайте статическую переменную в классе и в конструкторе инкрементируйте ее.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Январь 20, 2009, 13:41 »

а если я хочу и удалять объекты к примеру... то не напасешься разрядностью этого счетчика

например
1. создал 2000 объектов, Cnt=1-2000,
2. удалил из них 1000
3. создал еще 1000 -> Cnt=2001-3000 !!! (т.е не используются те значения ID которые были в удаленных мною объектах)

 т.е получается нифига не экономия!

ЗЫ: я раньше так делал... но это не то
Записан

ArchLinux x86_64 / Win10 64 bit
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Январь 20, 2009, 13:45 »

1. как уже предложил спирит, использовать статический член класс:

Код
C++ (Qt)
class YourClass
{
...
private:
  static int objectsCount = 0;
  int id;
};
 
YourClass::YourClass()
{
...
   id = objectsCount++;
...
}

При этом, objectsCount будет содержать общее кол-во созданных объектов.

2. А если просто использовать QMap? Например:

QMap<int, YourClass *> list;

при этом, ключ будет id вашего класса.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
spirit
Гость
« Ответ #4 : Январь 20, 2009, 13:47 »

а если я хочу и удалять объекты к примеру... то не напасешься разрядностью этого счетчика

например
1. создал 2000 объектов, Cnt=1-2000,
2. удалил из них 1000
3. создал еще 1000 -> Cnt=2001-3000 !!! (т.е не используются те значения ID которые были в удаленных мною объектах)

 т.е получается нифига не экономия!

ЗЫ: я раньше так делал... но это не то
что значит "неэкономия"? после удаления объектов уже ж не будет, а какая разница с какого числа будет айди начинаться?

еще как вриант советую вам почитать про шаровые классы и как они организованы. в принципе идее та же.
Записан
Rcus
Гость
« Ответ #5 : Январь 20, 2009, 13:50 »

если у вас объекты некопируемы, то что мешает в качестве уникального идентификатора объекта использовать указатель на него?(они совершенно точно уникальны в каждый момент времени и используются заново Улыбающийся) Хотя конечно если нужно хранение идентификаторов, то такой способ не подходит
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Январь 20, 2009, 13:55 »

Цитировать
Хотя конечно если нужно хранение идентификаторов, то такой способ не подходит
да! именно эти ID-ы должны храниться в БД...

Цитировать
что значит "неэкономия"? после удаления объектов уже ж не будет, а какая разница с какого числа будет айди начинаться?

а если объектов не 2000 а 200000! и например в процессе "конфигурирования" приложения - придется удалять/добавлять новые объекты... при этом счетчик будет делать ++ ... но счетчик - не резиновый!

и например после определенного кол-ва добавлений/удалений объектов - счетчик просто переполнится ! так что это решение - на крайняк , если ничего лучше не придумается Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
spirit
Гость
« Ответ #7 : Январь 20, 2009, 13:58 »

декрементируйте в деструкторе  Подмигивающий
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Январь 20, 2009, 14:05 »

Цитировать
декрементируйте в деструкторе  Подмигивающий

не покатит! (увы) Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #9 : Январь 20, 2009, 14:07 »

Интересно все же, какой смысл хранить эти идентификаторы во внешнем хранилище, если время жизни объекта настолько мало, что вы боитесь переполнения целочисленного счетчика?
Записан
spirit
Гость
« Ответ #10 : Январь 20, 2009, 14:09 »

Интересно все же, какой смысл хранить эти идентификаторы во внешнем хранилище, если время жизни объекта настолько мало, что вы боитесь переполнения целочисленного счетчика?
+1
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #11 : Январь 20, 2009, 14:27 »

Цитировать
Интересно все же, какой смысл хранить эти идентификаторы во внешнем хранилище, если время жизни объекта настолько мало, что вы боитесь переполнения целочисленного счетчика?
+1

Улыбающийся оно не мало! оно велико!

я наверное плохо обрисовал ситуевину:
1. при конфигурировании приложения (создании/удалении) объектов - информация о них сохраняется в БД (сохраняется и их ID)
2. ID необходим, чтобы к этим объектам можно было "привязать" другие объекты!
3. у других объектов - в БД храниться инфа : их ID + ID того объекта к которому их нужно привязать!.

т.е при старте приложения ( рабочий режим) происходить должно следующее:
1. сканируется БД "родительских объектов"
2. по информации, записанной в ней - создаются эти объекты в оперативной памяти (+ им присваиваются уникальные ID-ы которые были сохранены в их БД)
3. сканируется БД "дочерних" объектов.
4. по информации, записанной в этой БД (БД хранит не только ID дочернего но и ID родительского объекта) - создаются эти дочерние объекты со своими параметрами + создаются они в тех родительских объектах в которых ID-ы совпадают!!!

т.е ID-ы должны быть уникальными, чтобы все было нормуль!

ЗЫ: просто я смотрю наверное на все это не с позиции "чистого" программиста куллхацкера - а с позиции алгоритмиста АСУТП Улыбающийся
поэтому и по-другому наверное выражаюсь
Записан

ArchLinux x86_64 / Win10 64 bit
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #12 : Январь 20, 2009, 14:32 »

2 kuzulis: возми не int, a unsigned int (что более логично) Это 4294967295 объектов. Мало? Возмите unsigned long long если позволяет платформа, это 18446744073709551615 объектов. Но думаю unsigned int  для вашей задачи будет достаточно.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
spirit
Гость
« Ответ #13 : Январь 20, 2009, 14:32 »

а если айди при создании устанавливать в "0", а после записи в БД выгребать уникальный айди , который сгенерила база?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #14 : Январь 20, 2009, 14:34 »

2pastor ?

Смеющийся спс канешн.. я об этом думал.. но решил спросить тута.. может что-то в QT такое есть само по себе? Улыбающийся

ну... что-то вроде как в винде дескрипрор на что-то там.. его же само ядро ОС генерит.. и он уникальный! (наверное) Улыбающийся
 
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.074 секунд. Запросов: 23.