Как получить уникальный идентификатор объекта в C++?

Опубликовано: 19 Февраля, 2023

Предварительное условие: классы и объекты в C++

Отдельный объект в данной системе идентифицируется строкой цифр или букв, называемой уникальным идентификатором (UID). UID позволяют адресовать этот объект, разрешая доступ к нему и взаимодействие с ним. Есть несколько вариантов, в зависимости от ваших требований к «уникальности»:

Указатели допустимы, если они уникальны в пределах одного адресного пространства (также известного как «в пределах одного выполнения программы») и ваши объекты остаются на месте в памяти. Однако существуют опасности: если ваши объекты содержатся, каждое перераспределение может изменить их идентичность, а если вы разрешите копирование, объекты, возвращаемые функцией, могут быть получены с одного и того же адреса.

Используйте GUID/UUID, например boost.UUID, если вам требуется более высокая степень глобальной уникальности, например, потому что вы работаете с взаимодействующими приложениями или постоянными данными. Из статического счетчика можно сделать уникальные числа, но остерегайтесь следующих подводных камней:

  • Убедитесь, что ваши приращения атомарны.
  • Создавайте собственные конструкторы копирования или операторы присваивания, чтобы предотвратить копирование.

Чтобы отслеживать последующий идентификатор для использования, используйте статическую переменную. Пока у вас есть функция, которая может создавать уникальные значения, вы можете использовать что угодно в качестве уникального идентификатора. В примере 8.8 мы использовали static int, но вы можете использовать что угодно.

Идентификаторы не используются повторно в этой ситуации, пока не будет достигнута максимальная емкость int. После удаления объекта его уникальное значение теряется до тех пор, пока программа не будет перезапущена или значение идентификатора объекта не достигнет максимального значения и не перевернется. Уникальность этой программы может иметь некоторые интригующие преимущества.

Пример:

Объяснение: В приведенной выше программе мы создали класс, инициализировали 3 его объекта и присвоили каждому из них уникальный идентификатор, как показано в выводе.