Я хочу добавить уникальный идентификатор (в рамках одного сеанса) к каждому объекту определенного класса. Одно из решений - использовать заводскую функцию, которая увеличивает некоторый статический счетчик. Более простое решение - добавить этот счетчик к самому классу, например:
class fooWithUniqueId {
public:
fooWithUniqueId() : id(next_id++) {...};
long id;
private:
static long next_id = 0;
}
Недостаток, однако, заключается в том, что поле id
является общедоступным и может быть изменено вызывающей стороной, что нарушает его уникальность. Традиционным (ну, по крайней мере, на мой взгляд) является сделать id
закрытым и использовать функцию получения для доступа к нему, например:
class fooWithUniqueId {
public:
fooWithUniqueId() : id(next_id++) {...};
long getId() const { return id; };
private:
long id;
static long next_id = 0;
}
Но я рассматриваю другой подход. Я могу сделать id константным полем открытого класса:
class fooWithUniqueId {
public:
fooWithUniqueId() : id(next_id++) {...};
const long id;
private:
static long next_id = 0;
}
Мне этот способ нравится больше, потому что мне не нужно постоянно вызывать getId ()
каждый раз, когда мне нужен id, Я могу использовать идентификатор в качестве ключа на карте (поскольку конструкция копии правильно инициализирует идентификатор объекта копии). Один из недостатков, о котором я могу думать, заключается в том, что я не могу реализовать назначения между объектами fooWithUniqueId
, хотя в настоящее время мне эта функция не нужна.
Спасибо, Боаз