Это точно правильно, потому что компилятор должен знать, какой тип он предназначен для распределения. Поэтому классы шаблонов, функции, перечисления и т. Д. Должны быть реализованы также в файле заголовка, если он должен быть опубликован или частично из библиотеки (статический или динамический), поскольку файлы заголовков НЕ скомпилированы в отличие от файлов c / cpp, которые находятся. Если компилятор не знает, что тип не может его скомпилировать. В .Net это возможно, потому что все объекты происходят из класса Object. Это не .Net.
Получить уникальный 32-битный идентификатор интуитивно просто: следующий. Работает в 4 миллиарда раз. Уникален в течение 136 лет, если вам понадобится один раз в секунду. Дьявол в деталях: каким был предыдущий? Вам нужен надежный способ сохранить последнее использованное значение и атомный способ его обновления.
Насколько это будет сложно, зависит от области применения ID. Если это один поток в одном процессе, то вам нужен только файл. Если это несколько потоков в одном процессе, то вам нужен файл и мьютекс. Если на одной машине несколько процессов, то вам нужен файл и именной мьютекс. Если это несколько процессов на нескольких машинах, то вам нужно назначить авторитетного ID-провайдера, единственный сервер, с которым будут общаться все машины. Движок базы данных - это обычный провайдер, он имеет встроенную функцию, столбец автоинкремента.
Расходы на получение ID постепенно увеличиваются по мере расширения области видимости. Когда это становится непрактичным, границы видимости в Интернете или у провайдера слишком медленны или недоступны, тогда вам нужно отказаться от 32-битного значения. Переключитесь на случайное значение. Достаточно случайное значение, чтобы сделать вероятность поражения машины метеором как минимум в миллион раз выше, чем повторение одного и того же ID. Опознание. Это всего в 4 раза больше.
Вы можете видеть это . (Полный ответ, я думаю, находится на переполнении стека.)
.
Небольшое примечание для уникального идентификатора на C++ в Linux в этом сайте . И вы можете использовать uuid в Linux, смотрите эту man страницу и пример для этого.
Если вы используете окна и вам нужны API windows, см. эту MSDN страницу .
Эта страница Википедии также полезна: http://en.wikipedia.org/wiki/Universally_Unique_Identifier.
Контекста мало, но если вы ищете уникальный ID для объектов внутри вашего приложения, вы всегда можете использовать однокнопочный подход, подобный
class IDGenerator {
public:
static IDGenerator * instance ();
uint32_t next () { return _id++; }
private:
IDGenerator () : _id(0) {}
static IDGenerator * only_copy;
uint32_t _id;
}
IDGenerator *
IDGenerator::instance () {
if (!only_copy) {
only_copy = new IDGenerator();
}
return only_copy;
}
А теперь вы можете получить уникальный ID в любой момент, сделав:
IDGenerator::instance()->next()
Вот самый простой идентификатор, который я могу подумать.
MyObject obj;
uint32_t id = reinterpret_cast<uint32_t>(&obj);
В любой момент времени этот идентификатор будет уникальным в приложении. Ни один другой объект не будет расположен на том же адресе. Конечно, если вы перезагрузите приложение, объект может быть назначен новый идентификатор. И после того, как заканчивается срок службы объекта, другой объект может быть назначен тот же идентификатор.
И объекты в разных пространствах памяти (скажем, на разных компьютерах) могут быть назначены идентичные идентификаторы.
И последнее, но не менее важно, если размер указателя больше 32 бит, сопоставление не будет уникальным.
Но так как мы ничего не знаем о том, какой идентификатор вы хотите, а насколько уникально это должно быть, это кажется хорошим ответом, как любой.