我注意到,通过查看boost/stl,甚至阅读一些顶级c ++专家的着作,get/set不是c ++方式.
有没有人在他们的c ++类设计中使用get/set,并且如果这个范例属于c ++世界,有人可以建议一个经验法则吗?
它显然在Java中非常流行,并且使用Property语法糖来模仿c#.
编辑:
在下面的答案中提供的链接之一中阅读了更多相关信息之后,我遇到了至少一个参数,用于保持成员字段的访问者与成员字段的名称相同.也就是说,您可以简单地将成员字段公开为public,而是将其作为类的实例,然后重载()运算符.通过使用set/get,您不仅要强制客户端重新编译,还要实际更改其代码.
不确定我是否喜欢这个想法,对我来说似乎有点太精细了,但更多细节在这里:
C++杀死了Getter/Setter
C++没有像C#这样的属性.可以在名称中编写带"get"和"set"的方法,但它们不会自动创建属性.那么使用get和set方法是不错的做法呢?
在C++中使用get和set方法对于访问类属性并不错.STL和boost(受STL影响)只选择了一种设计 - 为您的课程设计不同的设计是完美的.
在我的工作中,我们确实使用get和set.原因主要在于它可以编写解析器以通过其他接口(ActiveX,.NET,LabVIEW,Python等)自动包装C++类....当使用Visual Studio的智能(以及其他IDE上的类似技术)时,我发现使用get和set方法可以更轻松地找到我的内容.因此,有时候使用get和set方法是不合适的.
最重要的是为库选择代码样式标准并与之保持一致.
封装是一种OOP概念,它适用于所有OOP语言.公共数据成员将破坏封装.如果你有一个不需要封装的非常简单的对象,这可能没问题,但是这些情况是例外,一旦你做出决定就很难回去并撤消它.
对于大多数对象,您需要使用getter和setter,但是在编写对象时应始终考虑如何实际使用该对象.Boost和STL充满了getter和setter,他们只是不使用名称"get"和"set"而是使用"length","end","reserve","capacity"等名称.他们之所以如此不要使用单词get或set是因为这些函数的用途不仅仅是在对象中设置一个值.
你的getter和setter也应该这样做.不是根据对象的工作方式来设计界面,而应根据它的使用方式来定义它.
你绝对可以在C++中使用访问器.这是一篇关于提出良好访问方案的好文章.相关文章还向您展示了一个简单的元访问器助手类,可帮助您轻松定义这些智能访问器.
通常,get/set方法通过公开内部实现和状态来破坏封装.如果您发现自己在类中的每一个数据上都使用了get/set,那么最好只使它成为一个只有公共数据而没有方法的简单聚合类型.
我并不真的认为get/set会让你更容易做一些事情,例如让你的类线程安全,因为你可以提供的有限同步可以防止所有错误的竞争条件.