Мой учитель потребовал, чтобы мы создали элемент данных идентификатора, который генерируется автоматически, и после его создания он не может быть изменен.
Какой наиболее подходящий тип?
если ответ
статический const int ID;
Как я могу сгенерировать его автоматически, пока он постоянный?
Поскольку идентификатор должен быть уникальным, необходимо убедиться, что два экземпляра никогда не получат одинаковый идентификатор. Кроме того, никто вне класса не должен вмешиваться в генерацию 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 миллиардов экземпляров
Вот пример:
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
). Таким образом, вы получаете экземпляры, которые имеют уникальные идентификаторы.
создайте идентификатор const как int, инициализируйте его в списке инициализации конструктора, как
SomeClass(): id(++staticIncrementingInt){
///other stuf here
}
Надеюсь это поможет.
Вы можете вызвать функцию (рант, в данном случае) в списке инициализации конструкции.
Теперь до вас, как вы можете посеять это.
Если ваш учитель позволяет повысить уровень свободы, попробуйте Boost.Uuid. Примером является Вот. это RFC 4122 совместимый.