为c ++类生成set / get方法

时间:2010-06-05 17:21:19

标签: c++ class methods get set

是否有任何工具可以自动为类生成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或eny其他工具吗?

5 个答案:

答案 0 :(得分:9)

实际上不是工具,但您可以在 Visual Assist X 中使用Encapsulate Method,例如,它为某些私有类成员制作 getter / setter 方法

当然,许多与VAX类似的工具都有相同的方法。

此外,如果您必须为大量的类执行此操作,您可以实现自己的命令行工具,并为您拥有的每个源文件启用它。

答案 1 :(得分:4)

为什么要生成这些方法?

通常,更好的方法是创建一个实际的用户界面来定义对象的操作,而不仅仅是各个属性的集合。通过创建类接口,您可以避免编写一堆getter和setter。

如果你真的需要为所有(甚至大多数)属性生成公共getter和setter,那么最好只是将它作为一个struct,然后不需要这样的生成。

答案 2 :(得分:3)

如果您正在使用Visual Studio,我的Atomineer Pro Documentation加载项将执行此操作 - 它将使用您选择的命名样式立即为成员字段添加getter / setter方法。

e.g。如果你有这个:

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,_speed,mSpeed,m_speed等)和getter / setter方法的命名方式(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;

答案 3 :(得分:2)

同意Kotti - Visual Assist(和其他插件)提供此功能。

实际的源代码应该有getter / setter,因为您可能希望根据需要添加验证并将更改通知给setter。

使用宏只是... facepunchable。 (愿意详细说明请求)。

答案 4 :(得分:0)

我找不到工具,所以我在10分钟内编写了一个python脚本。它不完美但有用:

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)

用法:&gt; python generate_getters.py ClassName.h 生成二传手留给读者练习。 ;)