Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';什么是更好的做法?保护/获取?_C++_Oop - Fatal编程技术网

C++ 什么';什么是更好的做法?保护/获取?

C++ 什么';什么是更好的做法?保护/获取?,c++,oop,C++,Oop,如果我有一个继承自另一个类的类,并且只有这个类必须使用某个变量,那么哪种做法更好?要在基类中对所述变量进行“保护”,还是将其私有化并为其提供一个受保护的getter 我听到过相互矛盾的事情。我的老师告诉我要始终使用getter,而其他人告诉我在任何级别使用getter都会暴露出糟糕的程序设计。真正的答案是什么?我觉得两者都是不合逻辑的极端 另外,如果getter和setter是糟糕的程序设计,为什么会这样 有没有什么资源可以教我更多关于如何构造代码的知识 在大多数情况下,getter和sette

如果我有一个继承自另一个类的类,并且只有这个类必须使用某个变量,那么哪种做法更好?要在基类中对所述变量进行“保护”,还是将其私有化并为其提供一个受保护的getter

我听到过相互矛盾的事情。我的老师告诉我要始终使用getter,而其他人告诉我在任何级别使用getter都会暴露出糟糕的程序设计。真正的答案是什么?我觉得两者都是不合逻辑的极端

另外,如果getter和setter是糟糕的程序设计,为什么会这样


有没有什么资源可以教我更多关于如何构造代码的知识

在大多数情况下,getter和setter确实显示出糟糕的设计。但没有一般规则。使用getter和setter的主要原因应该是为了调试,因此当您从派生类访问某个基类成员时,您可以在某个点设置断点以拦截对该成员的更改


所以,你应该适应。如果您计划使用2-3级继承,最好使用受保护的成员,因为成员可以更改的位置不多。如果更多,受保护的setter/getter可能是一个更好的选择-您不希望在每个可能修改基类成员的类中设置断点

如果不需要在派生类之外访问基类中的成员,则可以在基类中对其进行
保护。这就是
protected
访问说明符的目的

Getter和setter方法是一种明确的方式,表示此成员变量可供使用,通常应使用它们将成员公开给外部实体。它们清楚地表达了意图,但由于您的变量只需要在派生类中访问,因此
受保护的
访问说明符已经清楚地表达了意图。

除了读取值之外,您还需要(或预期将来需要)做其他事情吗?例如:断言、锁定或使读取多态

  • 如果没有,请使用该字段
  • 如果是,使用getter
您是否使用受保护的
与此完全正交


顺便说一句,C#和Java等托管语言通常需要getter,在“逻辑上”只要普通字段就足够了,因为它们的UI设计(和其他)工具就是以这种方式实现的。因此,过度使用吸气剂的做法似乎已经“擦除”了C++,尽管C++中缺乏反射或此类工具。

<代码>保护比私下< /代码>更接近公文< /代码>。人们可以创建派生类,访问和更改受保护的成员,并将其派生实例用作基类的实例。你可以据此做出决定。如果您希望外部世界的数据成员是只读的,那么您需要一个getter,这是没有办法的。受保护的getter(可能还有setter)也可以工作

另一件需要注意的事情是,setter可以充当数据的网关。它们可用于验证范围,并在需要时引发异常。也要考虑到这一点

另外,因为您说过它是供某个派生类使用的,所以您可能希望使该类成为朋友。这可能是个好主意,也可能不是个好主意,你应该仔细评估利弊

我不认为一般来说,getter和setter都是糟糕的设计。我确信它们会被滥用,就像几乎所有的习语或模式一样。概括从来都不是一个好主意


(1) 是的。

什么是课程。收集数据还是收集行为

他们当然都是。但让我们对比一下字段和访问器方法(getter和setter)如何使您能够处理数据和行为

字段

  • 是数据吗
  • 如果不改变依赖类,就不能改变它们的行为(除非它们是指向的指针)
  • 它们可以通过运算符直接访问,因此可以在表达式中内联使用
  • 你不可能对他们以名词为基础的名字那么聪明。他们通常不会被束缚在beahvior身上
存取器方法

  • 是行为
  • 您可以在不必更改依赖类的情况下更改它们(假设保持不变)
  • 您无法使用运算符直接访问它们,因此无法在尽可能多的表达式中直接使用它们(无需一些工作)
  • 你可以用它们
  • 你可以随心所欲地使用它们基于动词的名称(
    get
    Create
    Find
    ,等等)。它们定义了一种行为
切线:方法链接是整洁的,因为它允许您创建一个名为

封装

无论你做什么,你都应该记住你的OO原则。不要违背你的意愿

如果您编写了一个类,假设该类封装了它的整个行为,但却公开了一个字段,那么您已经破坏了封装。如果您已经编写了一个存储数据的类,并且具有方便的赋值/数据生成模式,恰好可以很好地映射到该类上的方法,那么您还没有破坏封装

对于您的类来说,哪种情况是正确的取决于该类的运行状态

何时使用每个

它们在某些上下文中都有意义

在较低级别的代码中,与数据更紧密、更密切地协作是有意义的。在这些情况下,您应该尽可能使用性能最好、数据绑定最多的语法。使用字段

在更高级别的代码中,与行为更紧密、更密切地合作是有意义的。在这些情况下,您应该尽可能使用最灵活和最受行为约束的语法。使用访问器。或者,通常不使用访问器。改用接口、类和非访问器方法

如果有疑问,我会选择灵活性而不是per