Есть ли способ автоматически генерировать геттеры и сеттеры, если они не присутствуют в C++?

У меня есть опыт работы с Objective - C, и в Objective-C вы можете позволить компилятору генерировать геттеры и сеттеры для вас, если они еще не присутствуют (@synthesize).

есть ли способ сделать это в C++, или мне нужно реализовать все геттеры и сеттеры себя?

8 ответов


Я не знаю о такой утилите, и она, вероятно, не будет много использовать в идиоматическом современном C++:

современные рекомендации C++ держат это класс не стоит есть геттеры и сеттеры. На самом деле сеттеры почти полностью бесполезны, а геттеры имеют очень ограниченную полезность. Это связано с устоявшимся принципом разработки программного обеспечения говори, не спрашивай.

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

  1. вы выполняете действие над ним, которое изменяет его состояние.
  2. вы создаете новый экземпляр.

Мутирующее состояние через сеттеры обычно является признаком запаха кода и плохого архитектурного дизайна.

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


не сам компилятор, а IDE, такая как eclipse CDT на самом деле сможете выполните это действие автоматически (щелкните правой кнопкой мыши на class > Source > Generate Getters и Setters...).


вы должны реализовать их самостоятельно


нет никакого способа сделать это. Однако, если вы используете полнофункциональную среду IDE, такую как Eclipse (не уверен, что Visual Studio имеет эту функцию), есть варианты удобства, чтобы среда IDE генерировала код getter/setter для вас.


нет, компилятор вам в этом не поможет. Например, вы можете создать макрос или создать некоторый код на шаге сборки..


преимущество для меня использования аксессоров (specialy easy в виде c# vb.net) is

1/ возможность установить точку останова в сеттер или геттер еще не знаю, кто и когда имеет доступ к члену.

2 / Вы можете контролировать, какое значение установлено в случае необходимости проверить переполнение или другой плохой набор. Это особенно необходимо в общедоступном libray, например, в Редакторе свойств для визуального компонента.

но это не полностью необходимо в ваш личный внутренний класс. Тогда выбор контролируемого доступа к члену должен быть установлен из конечного публичного использования вашего объекта, я думаю.


Если вы используете какой-то фреймворк, который будет генерировать POCOs для вас, то да, можно "генерировать" шаблонный код, чтобы это произошло, но сначала вы должны ввести концепцию в фреймворк или IDE.


по крайней мере, в Visual Studio 2015 я не могу его найти. Однако, если вы используете Resharper, то он может генерировать сеттер и геттер в .файл H