Член данных ID в классе С++

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

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


person Nora Alnashwan    schedule 15.03.2013    source источник
comment
Подсказка: вам понадобятся неконстантные статические и константные члены.   -  person qPCR4vir    schedule 15.03.2013


Ответы (5)


Поскольку идентификатор должен быть уникальным, необходимо убедиться, что два экземпляра никогда не получат один и тот же идентификатор. Кроме того, никто за пределами класса не должен вмешиваться в создание 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) уверены, что никакие два экземпляра не будут иметь одинаковый номер ID.


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

person Spook    schedule 15.03.2013
comment
Я доволен этим эффективным кодом, и он отлично работает. Большое спасибо. - person Nora Alnashwan; 15.03.2013

Вот пример:

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). Таким образом, вы получаете экземпляры с уникальными идентификаторами.

person Mark Garcia    schedule 15.03.2013
comment
Разве currID не является частным участником? Как будет работать последнее утверждение? Я немного смущен! - person Alpha Mineron; 17.07.2017
comment
@AlphaMineron Это похоже на то, как вы определяете частную (или любую) функцию-член [в файле .cpp]. Например. int MyClass::APrivateFunc() { ... }. Чтобы быть полностью ясным, вы помещаете int SomeClass::currId = 0; вне любой функции, опять же так же, как вы определяете функцию-член. - person Mark Garcia; 17.07.2017

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

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

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

person Adnan Akbar    schedule 15.03.2013

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

person Jefraim    schedule 15.03.2013

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

person Arun    schedule 15.03.2013