Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
1

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

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

Author24 — интернет-сервис помощи студентам
Как бы это поле реализовать? При передаче экземпляра значению любой функции, или оператору и при записи в экземпляр возвращаемого значения функции, или оператора, в том числе, в составе другого объекта, в том числе, объекта-массива значение UID должно копироваться, в остальных случаях требуется генеринг нового уникального значения при каждом создании нового экземпляра. Требется гарантировать, что ни одно значение UID не совпадёт со значением UID ни какого другого, даже удалённого экземляра.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2014, 08:56
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
2) сами понимаете, нельзя будет копировать
Оператором присваивания можно.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
14.03.2014, 10:03 10
Цитата Сообщение от taras atavin Посмотреть сообщение
Оператором присваивания можно.
угу из ф-ции по значению вернуть...сомневаюсь...
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
14.03.2014, 10:03 11
Цитата Сообщение от taras atavin Посмотреть сообщение
Класс, каждый экземпляр которого имеет поле UID с гарантированно уникальным значением
Паттерн Singleton вам в помощь. Используйте его как индетификатор UID и всего делов.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
14.03.2014, 10:05 12
Цитата Сообщение от Ilot Посмотреть сообщение
Используйте его как индетификатор UID и всего делов.
а когда этот уникальный идентификатор увеличивать, что бы различне экземпляры имели уникальные значения?
0
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 865
Записей в блоге: 1
14.03.2014, 10:15 13
Я нельзя в качестве этого идентификатора использовать адрес первой ячейки памяти, где он хранится?
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
14.03.2014, 10:16 14
Цитата Сообщение от aLarman Посмотреть сообщение
а когда этот уникальный идентификатор увеличивать, что бы различне экземпляры имели уникальные значения?
Когда ТС нужно пусть тогда и увеличивает. Примеров кода я не увидел так, что моя совесть чиста
Как я понял из условиия необходимо просто запретить копирование, а если быть точнее следует написать свой конструктор копий и следить за тем как передается объект. По ссылке все Ок, по значению конструктор копий. В чем вообще проблема?
0
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 865
Записей в блоге: 1
14.03.2014, 10:16 15
Генерируется в конструктор
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
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
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 865
Записей в блоге: 1
14.03.2014, 10:33 17
Цитата Сообщение от aLarman Посмотреть сообщение
а Если объект удалить
Так этого объекта нет уже, так зачем занимать его UId?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.03.2014, 10:34  [ТС] 18
Цитата Сообщение от Ilot Посмотреть сообщение
Паттерн Singleton вам в помощь. Используйте его как индетификатор UID и всего делов.
В каком месте у меня требование существование единственного экземпляра?
0
aLarman
14.03.2014, 10:35
  #19

Не по теме:

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

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

Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
угу из ф-ции по значению вернуть...сомневаюсь...
Хорошо, что напомнил.
0
14.03.2014, 10:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2014, 10:37
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru