Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
#1

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

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

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

Как создать список, каждый элемент которого имеет свое поле приоритета?
Задание: Организовать связный список каждый элемент которого имеет поле...

Написать класс, от которого можно получить только один экземпляр класса
Написать класс, от которого можно получить только один экземпляр класса. Как...

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

Выборка записей с уникальным значением в одном поле LINQ to SQL
Здравствуйте! Есть таблица "Услуги", с которой нужно вывести уникальные...

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

Сколько методов имеет каждый класс в этом коде?
Подскажите пожалуйста, сколько методов имеет каждый класс в этом коде. ...

27
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
14.03.2014, 09:10 #2
cтатическая переменная котораяю будет плюсоваться в реализации конструктора
правда тогда будет проблема с конструктором копирования, он может использоваться во время копирования аргументов ф-ции, а так же при инициализации нового экземпляра уже существующим экземпляром....
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
14.03.2014, 09:21  [ТС] #3
Цитата Сообщение от aLarman Посмотреть сообщение
правда тогда будет проблема с конструктором копирования, он может использоваться во время копирования аргументов ф-ции, а так же при инициализации нового экземпляра уже существующим экземпляром....
1. Как лучше решить эту проблему?
2. Есть ли ещё "подводные камни"?
А если так: при инициализации конструктором копирования копируется всё, включая UID, но после этого первая и только первая модификация любого поля меняет UID? Назначение класса таково, что существование полностью идентичных (даже за вычетом UID) экземпляров лишено смыла. Желательно конечно реализовать заявленное в стартовом посте, но на задачу-минимум пойдёт и вариант "положиться на то, что все остальные копии быстро перестанут быть таковыми".

Добавлено через 47 секунд
Цитата Сообщение от aLarman Посмотреть сообщение
cтатическая переменная... будет плюсоваться в реализации конструктора
Какой разрядности?
Цитата Сообщение от taras atavin Посмотреть сообщение
Требется гарантировать, что ни одно значение UID не совпадёт со значением UID ни какого другого, даже удалённого экземляра.
, так что декларировать её типа size_t и успокоиться тем, что раньше будет исчерпана память, чем переполнится счётчик, нельзя: удалённые экземпляры память не занимают, а в количество в такой постановке идут.
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
14.03.2014, 09:31 #4
эм....size_t это тайпдеф unsigned int, там 4 миллиарда значений, Вы в курсе что человек живет в среднем 2 миллиарда секунд?

Добавлено через 4 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
1. Как лучше решить эту проблему?
это конечно перебор, но например запретить его, во всех ф-циях передавать строго по ссылкам...
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
14.03.2014, 09:37  [ТС] #5
Цитата Сообщение от aLarman Посмотреть сообщение
эм....size_t это тайпдеф unsigned int, там 4 миллиарда значений, Вы в курсе что человек живет в среднем 2 миллиарда секунд?
А Вы в курсе, что за одну секунду можно выполнить более миллиона, а то и миллиарда операций? Так что создать, удалить и снова создать можно успеть и пару триллионов объектов. Менее, чем за сутки.

Добавлено через 3 минуты
Цитата Сообщение от aLarman Посмотреть сообщение
это конечно перебор, но например запретить его, во всех ф-циях передавать строго по ссылкам...
1. Что это даст? Ссылка то как раз не мешает, ведь копирование то не происходит, а происходит только заворачивание в синтаксис ссылки указателя, по которому находятся те же данные, а значит и неизменённый UID.
2. Как раз передача по ссылкам должна быть основным синтаксисом передачи параметров.
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
14.03.2014, 09:38 #6
Цитата Сообщение от taras atavin Посмотреть сообщение
Так что создать, удалить и снова создать можно и пару триллионов объектов.
ну это понятно, просто объекты будут так быстро генериться? или Вы не знаете как быстро, кстати в 11 стандарт включили long long я думаю там немного побольше значений

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
2. Как раз передача по ссылкам должна быть основным синтаксисом передачи параметров.
ну и хорошо, тогда конструктор копии запретите (в приват или если 11 стандарт "= delete") и увеличивайте значение только при создании (т.е конструктор)
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
14.03.2014, 09:44  [ТС] #7
Цитата Сообщение от aLarman Посмотреть сообщение
ну это понятно, просто объекты будут так быстро генериться? или Вы не знаете как быстро,
В том и дело, что заранее я этого не знаю.

Добавлено через 43 секунды
Цитата Сообщение от aLarman Посмотреть сообщение
кстати в 11 стандарт включили long long
Подозреваю, что версия компилятора об это не догадывается.

Добавлено через 2 минуты
Цитата Сообщение от aLarman Посмотреть сообщение
ну и хорошо, тогда конструктор копии запретите (в приват или если 11 стандарт "= delete") и увеличивайте значение только при создании (т.е конструктор)
А как тогда передать параметр-экземпляр по значению? И как вернуть экземпляр в виде значения функции/оператора?
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
14.03.2014, 09:53 #8
Цитата Сообщение от taras atavin Посмотреть сообщение
А как тогда передать параметр-экземпляр по значению?
Цитата Сообщение от taras atavin Посмотреть сообщение
2. Как раз передача по ссылкам должна быть основным синтаксисом передачи параметров.
Вы же вроде хотите передавать только по сслыкам
Цитата Сообщение от taras atavin Посмотреть сообщение
И как вернуть экземпляр в виде значения функции/оператора?
если это ф-ции и операторы принадлежащие классу, они смогут воспользоваться ими, и при возвращении по значению наверное не надо увеличивать UID вы же внутри ф-ции\оператора будете создавать новый экземпляр

Добавлено через 2 минуты
Вобщем получается так, 1) не вызывать конструктор копии для инициализации - тогда в конструкторе копии не инкрментить UID
конструктор копии оставить открытым и использовать если надо в ф-циях,
2) запретить конструктор копии (что бы нельзя было в принципе инициализировать объекты этим конструктором) тогда им смогут воспользваться только ф-ции члены и френды

Добавлено через 1 минуту
от сюда следуют некоторое ограничения, в 1) не понятно как явно запретить использование конструктора копии при инициализации (вроде таких механизмов нет, или я просто их не знаю)
2) сами понимаете, нельзя будет копировать
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
14.03.2014, 10:00  [ТС] #9
Цитата Сообщение от aLarman Посмотреть сообщение
Вы же вроде хотите передавать только по сслыкам
Цитата Сообщение от taras atavin Посмотреть сообщение
При передаче экземпляра по значению любой функции, или оператору и при записи в экземпляр возвращаемого значения функции, или оператора, в том числе, в составе другого объекта, в том числе, объекта-массива значение UID должно копироваться,
. Где здесь только по ссылкам?

Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
если это ф-ции и операторы принадлежащие классу, они смогут воспользоваться ими, и при возвращении по значению наверное не надо увеличивать UID вы же внутри ф-ции\оператора будете создавать новый экземпляр
Цитата Сообщение от taras atavin Посмотреть сообщение
При передаче экземпляра по значению любой функции, или оператору и при записи в экземпляр возвращаемого значения функции, или оператора, в том числе, в составе другого объекта, в том числе, объекта-массива значение UID должно копироваться, в остальных случаях требуется генеринг нового уникального значения при каждом создании нового экземпляра. Требется гарантировать, что ни одно значение UID не совпадёт со значением UID ни какого другого, даже удалённого экземляра.
. В каком месте здесь встречается слово "член"?

Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
2) сами понимаете, нельзя будет копировать
Оператором присваивания можно.
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
14.03.2014, 10:03 #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Оператором присваивания можно.
угу из ф-ции по значению вернуть...сомневаюсь...
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 10:03 #11
Цитата Сообщение от taras atavin Посмотреть сообщение
Класс, каждый экземпляр которого имеет поле UID с гарантированно уникальным значением
Паттерн Singleton вам в помощь. Используйте его как индетификатор UID и всего делов.
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
14.03.2014, 10:05 #12
Цитата Сообщение от Ilot Посмотреть сообщение
Используйте его как индетификатор UID и всего делов.
а когда этот уникальный идентификатор увеличивать, что бы различне экземпляры имели уникальные значения?
0
mustimur
268 / 222 / 72
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
14.03.2014, 10:15 #13
Я нельзя в качестве этого идентификатора использовать адрес первой ячейки памяти, где он хранится?
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 10:16 #14
Цитата Сообщение от aLarman Посмотреть сообщение
а когда этот уникальный идентификатор увеличивать, что бы различне экземпляры имели уникальные значения?
Когда ТС нужно пусть тогда и увеличивает. Примеров кода я не увидел так, что моя совесть чиста
Как я понял из условиия необходимо просто запретить копирование, а если быть точнее следует написать свой конструктор копий и следить за тем как передается объект. По ссылке все Ок, по значению конструктор копий. В чем вообще проблема?
0
mustimur
268 / 222 / 72
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
14.03.2014, 10:16 #15
Генерируется в конструктор
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
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 / 72
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
14.03.2014, 10:33 #17
Цитата Сообщение от aLarman Посмотреть сообщение
а Если объект удалить
Так этого объекта нет уже, так зачем занимать его UId?
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
14.03.2014, 10:34  [ТС] #18
Цитата Сообщение от Ilot Посмотреть сообщение
Паттерн Singleton вам в помощь. Используйте его как индетификатор UID и всего делов.
В каком месте у меня требование существование единственного экземпляра?
0
aLarman
14.03.2014, 10:35
  #19

Не по теме:

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

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

Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
угу из ф-ции по значению вернуть...сомневаюсь...
Хорошо, что напомнил.
0
14.03.2014, 10:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 10:37
Привет! Вот еще темы с решениями:

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

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

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

Количество элементов коллекции с уникальным значением свойства
Добрый день! Например, есть класс public class SomeClass { public int...


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

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

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