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

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

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

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

14.03.2014, 08:56. Просмотров 829. Ответов 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, 09:10 #2
cтатическая переменная котораяю будет плюсоваться в реализации конструктора
правда тогда будет проблема с конструктором копирования, он может использоваться во время копирования аргументов ф-ции, а так же при инициализации нового экземпляра уже существующим экземпляром....
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 09:21  [ТС] #3
Цитата Сообщение от aLarman Посмотреть сообщение
правда тогда будет проблема с конструктором копирования, он может использоваться во время копирования аргументов ф-ции, а так же при инициализации нового экземпляра уже существующим экземпляром....
1. Как лучше решить эту проблему?
2. Есть ли ещё "подводные камни"?
А если так: при инициализации конструктором копирования копируется всё, включая UID, но после этого первая и только первая модификация любого поля меняет UID? Назначение класса таково, что существование полностью идентичных (даже за вычетом UID) экземпляров лишено смыла. Желательно конечно реализовать заявленное в стартовом посте, но на задачу-минимум пойдёт и вариант "положиться на то, что все остальные копии быстро перестанут быть таковыми".

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

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

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

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

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

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
2) сами понимаете, нельзя будет копировать
Оператором присваивания можно.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
14.03.2014, 10:03 #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Оператором присваивания можно.
угу из ф-ции по значению вернуть...сомневаюсь...
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 10:03 #11
Цитата Сообщение от taras atavin Посмотреть сообщение
Класс, каждый экземпляр которого имеет поле UID с гарантированно уникальным значением
Паттерн Singleton вам в помощь. Используйте его как индетификатор UID и всего делов.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
14.03.2014, 10:05 #12
Цитата Сообщение от Ilot Посмотреть сообщение
Используйте его как индетификатор UID и всего делов.
а когда этот уникальный идентификатор увеличивать, что бы различне экземпляры имели уникальные значения?
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
14.03.2014, 10:15 #13
Я нельзя в качестве этого идентификатора использовать адрес первой ячейки памяти, где он хранится?
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 10:16 #14
Цитата Сообщение от aLarman Посмотреть сообщение
а когда этот уникальный идентификатор увеличивать, что бы различне экземпляры имели уникальные значения?
Когда ТС нужно пусть тогда и увеличивает. Примеров кода я не увидел так, что моя совесть чиста
Как я понял из условиия необходимо просто запретить копирование, а если быть точнее следует написать свой конструктор копий и следить за тем как передается объект. По ссылке все Ок, по значению конструктор копий. В чем вообще проблема?
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
14.03.2014, 10:16 #15
Генерируется в конструктор
0
14.03.2014, 10:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 10:16
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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