Создайте члены получения и установки для класса C ++ в Vim - PullRequest
4 голосов
/ 02 ноября 2010

Я создаю класс со многими двойными (или что-то еще, тип не имеет значения) членами.

class CalcParameters {
public:
  CalcParameters() {}
  ~CalcParameters() {}

  // getters and setters here

private:
  double _param1;
  double _param2;
  ...
};

Можно ли в Vim написать скрипт для автоматического генерирования общедоступных методов получения и установки для каждого параметра?

как

double param1() const { return _param1; }
void setParam1(double param1) { _param1 = param1; }
...

Примечание

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

Ответы [ 5 ]

3 голосов
/ 02 ноября 2010

Для простых классов данных иногда можно использовать boost::tuple (или std::tuple в C ++ 0x):

typedef tuple<int, char> MyDataElement;
MyDataElement data = make_tuple(1,'c');
int whatever = get<0>(data); // 1

Кроме того, подумав дважды, вы также можете рассмотреть возможность использования Повысить карту свойств .

Наконец, что касается сценария VIM, это, безусловно, можно сделать. Я немного исследовал, и вы можете сделать что-то вроде этого (предположим, что вы идентифицируете переменные-члены с префиксом, скажем m_):

:let bl = getbufline("" ,1, "$")

это загрузит все строки буфера, затем отфильтрует их по тем, которые содержат что-то "m _":

:let xx = filter(bl, 'v:val =~ "m_.*"')

затем вы можете исследовать, как извлечь фактические имена переменных из массива xx и т. Д.

2 голосов
/ 02 ноября 2010

Я написал ftplugin для этой цели давным-давно.

Идея состоит в том, чтобы набрать ;AA и ответить на вопросы, которые вам задает Vim.Он имеет примитивную форму понимания правильности const (то есть int будет скопирован, а string будет заменен на const-ref)

Я должен однажды переписать его сейчас, когда я знаю, какполучить тип уже записанного члена данных, а также несколько функций, предназначенных для преобразования идентификаторов (member <-> getter <-> setter <-> параметр <-> локальная переменная <-> слова, разделенные константой / подчеркиванием<-> нижний / верхний верблюжий чехлы).Увы, меня познакомили с Demeter , и я стараюсь свести к минимуму использование геттеров и сеттеров и, следовательно, необходимость модернизировать ftplugin.

РЕДАКТИРОВАТЬ: С тех пор я написал двановые методы рефакторинга для моего lh-refactor плагина: Extract Setter и Extract Getter .Как объяснено выше, методы извлечения знают, как построить имена установщика и получателя из имени переменной-члена.

2 голосов
/ 02 ноября 2010

Если это действительно так, как выглядит ваш класс, сохраните их по порядку в vector<double> и предоставьте один метод получения с индексом size_t в vector вместе с отдельным методом paramCount() для измерения вектора длина с использованием size().

0 голосов
/ 02 ноября 2010

Да. можно использовать Vim таким образом.

В VimCasts есть соответствующее видео , в котором описывается один из более простых способов автоматизации таких процессов, таких как макрос, отметки, немного рывков и вставок.

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

0 голосов
/ 02 ноября 2010

Переместите соответствующие данные за пределы раздела private и в раздел public.Никто не говорил, что все данные-члены должны быть частными: если это часть интерфейса, то она должна быть публичной, и, черт возьми, с этими многословными, избыточными, глупыми получателями и установщиками.

В программировании, если что-то может быть сделаносценарий, то это не должно быть сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...