是否有任何工具可以自动为类生成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其他工具吗?
答案 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 生成二传手留给读者练习。 ;)