Есть ли способ автоматически генерировать геттеры и сеттеры, если их нет в C ++? - PullRequest
19 голосов
/ 02 августа 2011

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

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

Ответы [ 7 ]

31 голосов
/ 02 августа 2011

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

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

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

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

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

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

8 голосов
/ 02 августа 2011

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

6 голосов
/ 02 августа 2011

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

4 голосов
/ 02 августа 2011

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

2 голосов
/ 02 августа 2011

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

1 голос
/ 21 февраля 2017

Для меня преимущество использования аксессоров (особенно легко в виде c # vb.net) -

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

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

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

0 голосов
/ 09 июля 2016

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

...