Генерация set / get методов для класса c ++ - PullRequest
3 голосов
/ 05 июня 2010

Существует ли какой-либо инструмент, который автоматически генерирует методы set и get для класса.

Просто я очень часто создаю классы и хотел бы иметь инструмент, который для каждого члена класса будет автоматически генерировать следующие функции:

Member_Type getMemberName() const; //in header file
Member_Type getMemberName() const //in source file 
{
    return member;
}

void setMemberName(const Member_Type & val); //in header
void setMemberName(const Member_Type & val) //in source file 
{
    member = val;
}

Я встречал такой макрос, но мне не понравилась идея:

#define GETSETVAR(type, name) \
private: \
    type name; \
public: \
    const type& get##name##() const { return name; } \
    void set##name##(const type& newval) { name = newval; }

Может быть, кто-то знает, как это сделать с помощью MS Visual Studio, или пользуетесь другим инструментом?

Ответы [ 5 ]

9 голосов
/ 05 июня 2010

На самом деле не инструмент, но вы можете использовать Encapsulate Method в Visual Assist X , например, что делает getter / setter методов для некоторого закрытого члена класса.

Конечно, многие из инструментов, которые работают подобно VAX, имеют те же методы.

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

4 голосов
/ 07 июня 2010

Почему вы хотите генерировать эти методы?

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

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

3 голосов
/ 10 июня 2010

Если вы используете Visual Studio, моя надстройка Atomineer Pro сделает это - она ​​мгновенно добавит методы получения / установки для поля элемента, используя выбранный вами стиль именования.

например. если у вас есть это:

public:

   ...

private:
    int m_Speed;

Затем вы можете выполнить команду для ее преобразования в

public:
    // Access the Speed
    int GetSpeed(void) const    { return(m_Speed);  };
    void SetSpeed(int speed)    { m_Speed = speed;  };

    ...

private:
    int m_Speed;

(Примечание: вам не нужно использовать «m_» или «Get ...» - это всего лишь пример, чтобы показать, как он обрабатывает схемы имен с префиксами или суффиксами. Вы можете настроить стиль именования элементов используемый (скорость, _speed, mSpeed, m_speed и т. д.) и стиль именования для методов получения / установки (GetSpeed ​​(), get_speed () и т. д.))


Применительно к члену C # он выполняет аналогичные действия:

protected int m_Speed;

затем вы можете выполнить команду для преобразования ее в автоматическое свойство:

protected int Speed { get; set; }

... и выполнить команду во второй раз, чтобы создать свойство с полем поддержки:

protected int Speed
{
    get { return(m_Speed); }
    set { m_Speed = value; }
}
private int m_Speed;
2 голосов
/ 10 июня 2010

Согласен с Kotti - Visual Assist (и другие надстройки) предоставляют эту функциональность.

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

Использование макроса для этого просто ... перфорируемо. (готовы уточнить по запросу).

0 голосов
/ 17 июня 2016

Я не смог найти инструмент, поэтому я написал скрипт на Python за 10 минут. Это не идеально, но полезно:

generate_getters.py:

#!/usr/bin/python
import sys

if len(sys.argv) < 1:
    print 'usage: > python script.py <cpp_file_name>'

fileName = sys.argv[1]
className = fileName.split('.')[-2].split("/")[-1]

print 'classname:' +  className

def printGetterSettersForLine(line):
    syntax = line.strip().split(';')[0]
    words = syntax.split()
    if len(words) != 2:
        return
    getter = words[0] + ' ' + className + '::get' + words[1].title() + '() { \n'
    getter = getter + '     return ' + words[1] + ';\n'
    getter = getter + '}';
    print getter

with open(fileName) as f:
        lines = f.readlines()
        for line in lines:
            printGetterSettersForLine(line)

Использование:> python generate_getters.py ClassName.h Создание сеттера оставлено в качестве упражнения для читателя. ;)

...