Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Класс, каждый экземпляр которого имеет поле UID с гарантированно уникальным значением - C++

14.03.2014, 08:56. Просмотров 828. Ответов 27
Метки нет (Все метки)

Как бы это поле реализовать? При передаче экземпляра значению любой функции, или оператору и при записи в экземпляр возвращаемого значения функции, или оператора, в том числе, в составе другого объекта, в том числе, объекта-массива значение UID должно копироваться, в остальных случаях требуется генеринг нового уникального значения при каждом создании нового экземпляра. Требется гарантировать, что ни одно значение UID не совпадёт со значением UID ни какого другого, даже удалённого экземляра.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2014, 08:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс, каждый экземпляр которого имеет поле UID с гарантированно уникальным значением (C++):

Написать класс, от которого можно получить только один экземпляр класса - C++
Написать класс, от которого можно получить только один экземпляр класса. Как такое реализовать? Если использовать только статические члены...

Есть массив Т [5], каждый элемент которого имеет тип "Структура Телефон". Ввести его с клавиатуры - C++
Есть массив Т , каждый элемент которого имеет тип "Структура Телефон". Ввести его с клавиатуры, и вывести на экран названия всех телефонов,...

Выборка записей с уникальным значением в одном поле LINQ to SQL - C#
Здравствуйте! Есть таблица "Услуги", с которой нужно вывести уникальные значения "Тип" и любые "idУслуги" (в базе хранятся несколько услуг...

Экземпляр класс имя которого храниться в строке - C#
Всем привет. Скажите как можна создать екземпляр класса имя которого храниться в string-е. и вызвать метод имя которого храниться тоже в...

Сколько методов имеет каждый класс в этом коде? - C#
Подскажите пожалуйста, сколько методов имеет каждый класс в этом коде. using System; using System.Collections.Generic; using...

Нужен класс, метод которого бы создавал кнопку и помещал ее на ту форму, где вызывается его экземпляр - C#
Всегда создавал кнопки таким методом: public Button _but; public int kolvo=0; this._but = new Button; this._but = new Button(); ...

27
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
14.03.2014, 10:27 #16
Цитата Сообщение от Ilot Посмотреть сообщение
В чем вообще проблема?
в том что конструктор копии использвуется в нескольких контекстах, например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{};
 
 
func(A obj)
{
 
}
 
A object;
A object2 = object;//констр копир
A object3(object2);//констр копир тут новый объект следовательно новый UID нужен
 
func(object)//тут тоже копирование тут поидее генерить новый UID не надо
Добавлено через 54 секунды
Цитата Сообщение от mustimur Посмотреть сообщение
первой ячейки памяти, где он хранится?
а Если объект удалить, а при посл созданиях новй экземпляр попадет в эту же ячейку?
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
14.03.2014, 10:33 #17
Цитата Сообщение от aLarman Посмотреть сообщение
а Если объект удалить
Так этого объекта нет уже, так зачем занимать его UId?
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 10:34  [ТС] #18
Цитата Сообщение от Ilot Посмотреть сообщение
Паттерн Singleton вам в помощь. Используйте его как индетификатор UID и всего делов.
В каком месте у меня требование существование единственного экземпляра?
0
aLarman
14.03.2014, 10:35
  #19

Не по теме:

mustimur, это шедееевр

0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 10:37  [ТС] #20
Цитата Сообщение от mustimur Посмотреть сообщение
Я нельзя в качестве этого идентификатора использовать адрес первой ячейки памяти, где он хранится?
Нельзя.

Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
угу из ф-ции по значению вернуть...сомневаюсь...
Хорошо, что напомнил.
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
14.03.2014, 10:44 #21
Цитата Сообщение от aLarman Посмотреть сообщение
mustimur, это шедееевр

Не по теме:

Ну простите пытаюсь найти самое простое решение....

0
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
14.03.2014, 10:47 #22
Я бы сделал так:
1. закрыл (private) все создающие конструкторы, вместо них в интерфейсе должны быть явно вызываемые функции типа create(...) или create_dynamic(...). Они возвращают уже готовый объект (или указатель на него).
2. конструкторы копирования, перемещения и оператор= - открытые.
3. ну и этот UID - что-то типа GUID'а, 128 бит вроде должно хватить на обозримый период времени Но если мало - можно и 256 бит забабахать. Функция генерации нового уникального UID вызывается только при создании нового объекта, но не при копировании существующего. А создание нового объекта в силу п.1 можно сделать только явным вызовом функции create.

Какие "дыры" могут оказаться в реализации такой схемы?
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
14.03.2014, 10:53 #23
Цитата Сообщение от CheshireCat Посмотреть сообщение
Какие "дыры" могут оказаться в реализации такой схемы?
Цитата Сообщение от CheshireCat Посмотреть сообщение
2. конструкторы копирования, перемещения и оператор= - открытые.
C++
1
2
3
4
5
class A
{};
  
A object;
A object2 = object;//констр копир
Добавлено через 58 секунд
создали новый объект с тем же UID

Добавлено через 3 минуты
Кстати, есть такая штука в boost или 11 с++ как ref() этот объект копировать можно, но он не копирует то, на что создана ссылка, если не хотите юзать boost или нет 11 с++, то можно самому описать этот класс
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
14.03.2014, 10:54 #24
соответственно везде где есть копирование передавать объект std::ref(Ваш класс)
0
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
14.03.2014, 10:54 #25
А разве не того же самого хотел ТС? Или я неправильно понял?
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
14.03.2014, 10:57 #26
Цитата Сообщение от CheshireCat Посмотреть сообщение
А разве не того же самого хотел ТС?
при создании экземпляра ему (экземпляру) новый UID давать) создавать можно как конструктором так и конструктором копирования, сделать генерацию нового UID там вроде бы логично, но есть проблема с конструктором копирования, он еще может использовать при передаче по значени, где не надо генерить новый UID
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 11:19  [ТС] #27
Цитата Сообщение от mustimur Посмотреть сообщение
Так этого объекта нет уже, так зачем занимать его UId?
Затем, что UID - это параметр функции-члена контейнерного класса, осуществляющей поиск, возвращающей индекс найденного элемента, а если объект уже удалён, то она должна вернуть
C++
1
std::numeric_limits<size_t>::max()
, что будет признаком ошибки. А теперь представь, что до попытки поиска UID удалённого объекта оказался занят новым объектом. Что она вернёт? Правильно, индекс этого нового объекта, сообщения же об ошибке не будет.
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
14.03.2014, 17:15 #28
Цитата Сообщение от taras atavin Посмотреть сообщение
А теперь представь, что до попытки поиска UID удалённого объекта оказался занят новым объектом. Что она вернёт? Правильно, индекс этого нового объекта, сообщения же об ошибке не будет
Да понял я это, я просто искал простое решение, тем паче, что в первой теме таких пояснений нет
0
14.03.2014, 17:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 17:15
Привет! Вот еще темы с ответами:

MySQL Вывод записей из БД с уникальным значением - PHP БД
Здравствуйте, есть одна идея, но не знаю, как реализовать! Есть таблица, допустим table, с какими-то полями, одна из которых name, порядок...

Как выбрать данные с уникальным значением поля - Oracle
Приветствую. Необходимо решить следующую задачу: Нужно выбрать из базы список полей заданной таблицы и информацию о внешних ключах этих...

Создать класс, одно поле которого - двумерный массив - C#
Надо создать класс, в нем массив двухмерный. Чтение размеров и элементов с клавиатуры, вычисление произведения макс. элементов строчек,...

Поле с уникальным идентификатором - PostgreSQL
Доброго времени суток, в существующею таблицу нужно добавить поле, и что бы значение в этом поле было всегда уникальным, само поле не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru