Вопрос по c++ – статический счетчик в с ++

7

Я пытаюсь создатьData класс, чьи объекты каждый содержит уникальный идентификатор.

Я хочу, чтобы 1-й объект был равен 1, 2-й - 2 и т. Д. Я должен использоватьstatic int, ноall объекты имеют одинаковый идентификатор, а не 1, 2, 3 ...

ЭтоData учебный класс:

class Data
{
private:
   static int ID;
public:
   Data(){
   ID++;
   }
};

Как я могу сделать так, чтобы первый идентификатор был 1, второй - 2 и т. Д.?

@ 0A0Dlong шире чемint, Если мы не знаем, сколько объектов мы хотим, лучше использоватьlong. shan
@shan: Какие люди? Это может быть все, что он хочет. user195488
Обычно люди используютlong для этого, а неint. shan
Убедитесь, что вы позаботились о многопоточности, так как переменнаяstatic. iammilind
@shan: он вернется к отрицательному значению (или к нулю, если он не подписан).long будет ролловер в конце концов тоже. Целое число без знака переходит к 65535. Все зависит от приложения. user195488

Ваш Ответ

5   ответов
16

Это:

class Data
{
private:
   static int ID;
   const int currentID;
public:
   Data() : currentID(ID++){
   }
};

Помимо статического счетчика, вам также нужен член с привязкой к экземпляру.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededIDError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededconstError: User Rate Limit Exceededoperator=Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededconstError: User Rate Limit Exceededthis answerError: User Rate Limit ExceededconstError: User Rate Limit Exceededconst.
2

Инициализация статической переменной внутри функции разрешена, поэтому решение может быть примерно таким

 class Data
 {
    private:
    static int ID ()
    {
       static int ID = 0;
       return ID ++;
    }
    int myId;

    public:
    Data(): myId (ID ())
    {      
    }
 };
1

Каждый экземплярData нужна собственная нестатическая переменная-член, в которой хранится ее идентификатор.static переменная может использоваться для хранения последнего использованного идентификатора, который будет увеличен в конструктореData.

Вместоstatic счетчик, который не является потокобезопасным, рассмотрите возможность использованияповысить UUID:

#include <boost/lexical_cast.hpp>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>

using boost::lexical_cast;
using boost::uuids::uuid;
using boost::uuids::random_generator;

std::string id_ = lexical_cast<std::string>((random_generator())());
-1

где здесь экземпляр экземпляра (не статический)? вам нужно объявить новое поле ID экземпляра, как это

int m_ID;

тогда в твоем конструкторе сделай

Data(){m_ID = ::InterlockedIncrement(&ID);}

всблокированы или другой потокобезопасный способ

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
9

он будет иметь одинаковое значение для всех экземпляров класса.

Если вы хотите, чтобы каждый экземпляр имел последовательные значения идентификатора, вы можете объединить статический атрибут с переменной класса, например так:

class Data
{
private:
   static int ID;
   int thisId;
public:
   Data(){
   thisId = ++ID;
   }
};

int Data::ID = 0;

Если приложение будет многопоточным, вам придется синхронизировать его с чем-то вроде мьютекса pthread.

Error: User Rate Limit Exceeded Jjang
Error: User Rate Limit ExceededuniqueError: User Rate Limit ExceededsharedError: User Rate Limit ExceededstaticError: User Rate Limit Exceeded
Error: User Rate Limit ExceededstoreError: User Rate Limit Exceeded

Похожие вопросы