|
|
1
31
我认为,在C++中提供访问器比C语言更重要。 C++没有对属性的内置支持。在C中,您可以将公共字段更改为属性,而无需更改用户代码。在C++中,这是 harder . 为了减少类型,您可以将普通的setter/getter实现为内联方法:
|
|
|
2
34
冒着争论的风险,我将支持我在阅读“模式上的holub”时第一次遇到的一个相反的观点。这是一个非常具有挑战性的观点,但经过深思熟虑后对我来说是有意义的: 能手和二传手都是邪恶的。 getter和setter的使用与面向对象设计的基本原理相反:数据抽象和封装。过度使用getter和setter会使代码在长期内变得不那么敏捷和可维护。它们最终公开了类的底层实现,将实现细节锁定到类的接口中。 假设您的“std::string foo::bar”字段需要从一个std::string更改为另一个字符串类,也就是说,它更好地优化或支持不同的字符集。您需要更改私有数据字段、getter、setter,以及这个类中调用这些getter和setter的所有客户机代码。 与其将类设计为“提供数据”和“接收数据”,不如将它们设计为“执行操作”或“提供服务”。问问自己为什么要写一个“getbar”函数。你用这些数据做什么?也许你在上面显示数据或者在上面做一些处理。这个过程作为一种foo方法是否更好地暴露? 这并不是说getter和setter没有他们的目的。在C i中,我相信它们使用的根本原因是与VisualStudio GUI设计IDE进行接口,但是如果您发现自己在C++中编写它们,那么最好向后退一步,看看您的设计,看看是否有什么东西丢失了。 我试着模拟一个例子来说明。
不需要很长时间就可以看出这个设计很差。
getter和setter使解决问题变得更加困难,因为客户机代码dostuffWithAccount现在绑定到我们用于实现帐户余额的数据类型。 所以,让我们通过这段代码,看看我们能改进什么
“浮动”是朝正确方向迈出的一步。当然,您可以将内部类型更改为“float”,并且仍然支持getter/setter习惯用法:
但是不需要很长时间就可以意识到getter/setter的安排会使您的工作负载翻倍,并且会使问题复杂化,因为您需要同时支持使用ints的代码和将使用float的新代码。deposit函数使扩展存储类型的范围变得更加容易。 类帐户可能不是最好的例子,因为“获取”帐户余额是帐户的自然操作。不过,总的来说,您必须小心getter和setter。不要养成为每个数据成员编写getter和setter的习惯。如果不小心的话,很容易暴露并将自己锁定到一个实现中。 |
|
3
11
在您的示例中:
你的意思可能是:
放
C++中经常出现纯吸气剂。一个例子
至于打字是否工作量太大,值得吗?这似乎是个奇怪的问题!如果需要让客户机访问某些信息,请提供getter。如果你没有,那就不要。 |
|
|
4
7
[编辑]我似乎需要强调的是,setter需要验证参数并强制实施不变量,因此它们通常不像这里那么简单。[/编辑] 不是全部,因为要额外输入。现在视觉辅助给了我“封装字段”,我更倾向于使用它们。 如果在类声明中只实现内嵌的默认setter/getter,那么legwork就不多了(我倾向于这样做——不过,更复杂的setter会移到主体中)。 一些注释: 常态: 是的,应该是警察。但是,如果按值返回,则将返回值设置为常量是没有用的。对于可能比较复杂的返回值,您可能希望使用const&though:
设置器链接: 许多开发人员喜欢这样修改setter:
它允许调用多个setter,例如:
不过,这并不是一件被普遍接受的好事。 __declspec(property) VisualC++提供了这种非标准扩展,以便调用方可以再次使用属性语法。这在类中增加了一点腿部工作,但使调用程序代码看起来更友好。 所以,总之,有一点更多的法律工作,但是在C++中做出一些决策。典型的; |
|
|
5
6
在这方面没有严格的约定,比如C语言或Java语言。许多C++程序员只会让变量公共保存自己的麻烦。 正如其他答案所说,你不应该经常需要一套,在某种程度上,得到方法。 但是,如果你真的做了它们,那么就不需要输入更多的内容了:
在类中以内联方式声明函数可以节省键入的内容,并为编译器提供您希望函数内联的提示。它的输入量不比C等同物多多少。 需要注意的一点是,我删除了get/set前缀。相反,我们只有两个bar()重载。这在C++中很常见(毕竟,如果它不带任何参数,我们知道它是吸气剂),如果它需要一个参数,它就是SETER。我们不需要这个名字来告诉我们),这样可以节省更多的输入时间。 |
|
|
6
4
我很少在自己的代码中使用getter和setter。 Veefu's answer 我觉得不错。 如果您坚持使用getter和/或setter,则可以使用宏来削减锅炉板。
|
|
|
7
3
获取和设置数据成员qua数据成员:
坏的
.
|
|
|
8
3
在银行业的例子中,反对使用API设计的get/set的论据是现场的。如果字段或属性允许用户违反业务规则,则不要公开它们。 但是,一旦您决定确实需要字段或属性,请始终使用属性。 C中的自动属性非常容易使用,并且有许多方案(数据绑定、序列化等)不适用于字段,但需要属性。 |
|
|
9
1
如果您正在开发COM组件,那么是的,它是 非常 流行的。 |
|
|
10
1
如果你不得不用任何语言来表达,那么“获得”和“设定”都会给人带来痛苦。 埃菲尔有它更好的地方,所有不同的是,你必须提供的信息量,以获得答案-一个函数与0参数是相同的访问一个成员变量,你可以自由地改变它们。 当您控制接口的两边时,接口的定义看起来并不是一个大问题。然而,当你想改变实现细节,它造成重新编译客户端代码,这是常见的情况下,C++中,你希望能够尽量减少这一点。像这样的 pImpl 而get/set将在公共API中得到更多的使用,以避免这种损害。 |
|
|
11
1
如果变量值中有约束,则get和set方法非常有用。例如,在许多数学模型中,有一个约束可以将某个浮点变量保持在范围[0,1]内。在这种情况下,get和set(特别设置)可以起到很好的作用:
此外,某些属性必须在读取前重新计算。在这些情况下,可能需要大量不必要的计算时间来重新计算每个CICLE。因此,优化它的一种方法是只在读取时重新计算。为此,请重载get方法,以便在读取变量之前对其进行更新。 否则,如果不需要验证输入值或更新输出值,那么将属性公开并不是犯罪,您可以继续使用它。 |
|
|
12
0
如果使用C++ +CLI作为C++的变量,那么它在语言中具有本地属性支持,因此您可以使用
这和
在C语言中。如果需要对get/set方法进行更精确的控制,则可以使用
在标题和
在.cpp文件中。我现在记不起来了,但我认为您可以对get和set方法(public/private等)拥有不同的访问权限。 柯林 |
|
|
13
-1
是的,get和SET在C++世界中很流行。 |
|
|
14
-3
如果您定义了一个属性,编译器将发出set_u和get_u,所以它实际上只是保存了一些输入。 这是一个有趣的讨论。这是我最喜欢的书 "CLR via C#". 这是我引用的。
|
|
|
MWRazer · 在类-C上具有作为属性的函数++ 2 年前 |
|
|
Vopel · 添加隐藏的属性,除非该属性具有值 2 年前 |
|
Shane Amare · 构造函数和对象构造之间的区别是什么? 2 年前 |