Член класса - константный для внешнего мира, неконстантный для класса

Ну, например, у меня есть класс карты, в котором есть несколько членов: sizeX, sizeY, вектор тайлов, имя и т.д.

Существует 2 основных подхода к управлению его переменными, доступ к которым осуществляется извне:

  • инкапсуляция, но добавляет много кода и больше ввода (константные функции setX() и getX())
  • иметь переменные, к которым часто обращаются извне, в качестве общедоступных членов и упростить их

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

Есть ли лучший подход для этого в С++ 11? Есть ли для него ключевое слово?


person user1873947    schedule 23.01.2013    source источник
comment
Не отвечая на ваш вопрос, но если у вас есть частный член X_ и общедоступная функция-член X(), это только 2 дополнительных символа для ввода для внешних пользователей и один символ для внутреннего использования в классе (плюс однострочное определение X ()). Чем меньше вы сэкономите, тем сложнее будет что-то изменить. Хотя, похоже, это может быть удобно.   -  person Marc Glisse    schedule 23.01.2013
comment
Публичный const& для закрытого члена должен работать, но это не избавит вас от необходимости много печатать (и это выглядит странно).   -  person Mat    schedule 23.01.2013
comment
@Marc Glisse, это еще одна идея (просто сократите набор текста), но 50 переменных означают 50 функций, это не такая быстрая разработка. Тем не менее, это, кажется, решение, я думаю.   -  person user1873947    schedule 23.01.2013
comment
Если вы сделаете это для 50 функций, я бы просто написал макрос, чтобы помочь с этим, тогда я мог бы просто написать: MEMBER(int,x).   -  person Marc Glisse    schedule 23.01.2013
comment
@Marc Glisse О да, макро. Я думаю, что вы можете сделать ответ с этим.   -  person user1873947    schedule 23.01.2013
comment
Похоже, вы натыкаетесь на концепцию, называемую свойствами; из которых класс может использовать, чтобы разрешить публичный немодифицирующий доступ, но внутренне приватную модификацию. C++ изначально не поддерживает это, но есть несколько способов эмулировать эту функциональность.   -  person dans3itz    schedule 23.01.2013
comment
@dans3itz именно это. Не могли бы вы рассказать мне что-нибудь об эмуляции этого в С++?   -  person user1873947    schedule 23.01.2013
comment
stackoverflow.com/questions/5772480/ | | Вопрос отображает расширение MSVC; ответы дают идеи для переносимости   -  person dans3itz    schedule 23.01.2013


Ответы (1)


Простой обходной путь, чтобы немного уменьшить количество ввода:

#define MEMBER(T,x) \
  private: T x##_; \
  public: T const& x () const { return x##_; }

struct A {
  MEMBER(int,x)
  MEMBER(double,y)
};

тогда вы можете использовать x_ и y_ внутри класса и x() и y() снаружи.

person Marc Glisse    schedule 23.01.2013
comment
Я пойду с ним. А еще я добавлю в макрос функцию setX(T), когда действительно нужно изменить извне, но это будет сделано явно. - person user1873947; 23.01.2013