ID данных члена в классе c ++

Мой учитель потребовал, чтобы мы создали элемент данных идентификатора, который генерируется автоматически, и после его создания он не может быть изменен.
Какой наиболее подходящий тип?
если ответ
статический const int ID;

Как я могу сгенерировать его автоматически, пока он постоянный?

4

Решение

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

Сначала вы определяете статическое поле в вашем классе:

class Data
{
private:
static int newUID;

(...)
};

// The following shall be put in a .cpp file
int Data::newUID = 0;

Затем, после создания каждого экземпляра, он должен принять новое значение идентификатора и увеличить счетчик newUID:

class Data
{
(...)
const int uid;

public:
Data()
: uid(newUID++)
{
}

int GetUid()
{
return uid;
}
};

Никто не имеет доступа к внутреннему newUID, кроме класса, ID генерируется автоматически для каждого экземпляра, и вы (почти1) уверен, что никакие два экземпляра не будут иметь одинаковый идентификационный номер.


1 Если вы не генерируете чуть более 4 миллиардов экземпляров

7

Другие решения

Вот пример:

class SomeClass {
static int currID;

public:
const int ID;

SomeClass() :
ID(currID++) {  // Initialization list used to initialize ID

}
};

И вы должны поместить это где-нибудь в свой файл .cpp:

int SomeClass::currId = 0;

Это использует списки инициализации сделать трюк. Мы должны сделать это так, потому что это только в списках инициализации, где вы можете назначить const член в экземпляре.

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

2

создайте идентификатор const как int, инициализируйте его в списке инициализации конструктора, как

 SomeClass(): id(++staticIncrementingInt){
///other stuf here
}

Надеюсь это поможет.

1

Вы можете вызвать функцию (рант, в данном случае) в списке инициализации конструкции.
Теперь до вас, как вы можете посеять это.

1

Если ваш учитель позволяет повысить уровень свободы, попробуйте Boost.Uuid. Примером является Вот. это RFC 4122 совместимый.

1