c ++ const public field vs. метод получения

Я хочу добавить уникальный идентификатор (в рамках одного сеанса) к каждому объекту определенного класса. Одно из решений - использовать заводскую функцию, которая увеличивает некоторый статический счетчик. Более простое решение - добавить этот счетчик к самому классу, например:

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 , хотя в настоящее время мне эта функция не нужна.

  • Каковы плюсы и минусы каждого подхода (функция получения / поле const)?
  • Предполагая, что я использую подход 'const', есть ли способ позже реализовать оператор присваивания без нарушения кода?

Спасибо, Боаз

7
задан bavaza 13 February 2011 в 13:24
поделиться