首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++:使用朋友类而不是编写getter/setter的糟糕做法?

这个问题涉及到了C++编程语言中的类设计和封装原则。在面向对象编程中,我们通常遵循封装原则,即将类的实现细节隐藏起来,只暴露必要的接口。这样可以保证类的内部实现不会被外部代码影响,提高了代码的可维护性和安全性。

在这个问题中,使用朋友类而不是编写getter/setter的糟糕做法,是指在C++中使用了友元函数(friend function)或友元类(friend class)来访问类的私有成员,而不是通过getter和setter方法来访问。这种做法可能会导致以下问题:

  1. 破坏封装原则:友元函数或友元类可以直接访问类的私有成员,这样会使类的实现细节暴露给外部代码,破坏了封装原则。
  2. 降低代码可维护性:当类的实现发生变化时,使用友元函数或友元类的代码可能需要进行大量修改,降低了代码的可维护性。
  3. 降低代码安全性:友元函数或友元类可以直接访问类的私有成员,这可能会导致代码安全性降低。

因此,在C++编程中,建议使用getter和setter方法来访问类的私有成员,而不是使用友元函数或友元类。这样可以保证类的封装性和安全性,提高代码的可维护性和可读性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Getter & Setter:使用还是废弃

Ken Arnold讲述了他们决定使用公共属性,而不是带存取方法的私有属性的经历(详情) 人们被告知不要使用公共属性,公共属性不好,有时这会让人们感觉不舒服,而且时常人们会使用不容置疑的语气来论述。...以这种方式使用的Getter和Setter通常破坏了封装性。 一个真正完整封装的类是没有setter方法的,而且最好也没有getter方法。...类应该负责使用自身的数据计算并返回结果,而不是从某个类获得数据并计算这些数据。...看下面的例子 如果我们需要获得一个特殊的页面,我们会编写以下的代码, 这里值得注意的是: 而且,更糟糕的是Map的任何客户端代码都可以清空这个Map,这通常是我们所不希望的。...一个类应该使用它自身的属性,并对外提供强大的功能,而不是仅仅作为一个被其他类操作的存储状态属性的存储池。

1.3K60

TW洞见〡getter和setter的那些事

这些以get和set开头的方法,被称为getter和setter。时间久了,这种做法似乎成了一种神圣的约定,每个人都记得应该这么写,而忘记了为什么这么写。...但是,当你写了很多程序,写过很多getter和setter,尤其是有些类方法,只有getter和setter时,总会有一天,你会疑惑,我到底为什么要这么干? Why private field?...数据需要被保护起来,而getter和setter是将数据暴露出来。看起来这是一对矛盾。 前面提到,每一个独立的代码单元都可以看成是一个图灵机。...正是考虑到未来可能出现的功能扩展,所以像Java和C++这样的语言,即使还不确定是否应该将字段保护起来,也要写getter和setter,而这也导致了很多多余代码。...Why getter & setter, again? 然而,却并不是所有语言都是这样的。比如和Java最像的C#,虽然也建议将字段设置为private,但是却可以不用getter和setter。

89860
  • Java 最困扰你的那些事

    负责任地说,我从不使用 Java 写程序的最大因素就是因为我恨它。还有一点就是JRE糟糕的模块化。...就算你用了一些加载工具比如Launch4j,你仍然需要让用户安装一个超过200 MB 的框架来运行程序。 没有getter、setter Java还缺少getter和setter注解。...还缺些什么 缺少宏对我来说使 Java 减分不少(我并不说在 C/C++ 中使用的预处理器宏,而是在Lisp/Scheme 中使用的那种宏)。...还是getter、setter 1、null(最大槽点)。 2、没有getter和setter注解(例如,没有属性)。 3、Java 只支持位置参数。...如果没有给变量或方法一个修饰符,那么这个方法应该是私有的,而不是包内可见。 默认的修改能力。最终类型(在所有情况下)应该是默认的,并用“var”作为修饰符。

    86580

    浅谈python,c,java,优劣,语言高低与效率相反的不变规律

    而谈到很多朋友在讨论的,关于python是不是有设计缺陷的问题?我个人觉得,这个问题,就像讨论用铁锤剪脚指甲,有些朋友说,铁锤是有设计缺陷的,因为我尝试用铁锤去剪指甲,已经弄坏了我的两个脚趾头。...如果你的应用程序或者平台,要被Python编程语言开发者使用,那么他们只会感谢你,没有在他们的工作中,添加使用XML的负担。 4、尽量不要使用Getter和setter。...Python编程语言对象不是Java Bean。因此尽量不要去写getter和setter,而是把它们内置在“属性”里。...在Java中,你必须使用getter和setter,因为公共字段不允许你以后改变想法时,再去使用getter和setter。...而在Python中,这样做是很傻的,因为你完全能够以一个普通特性开始,并可以在任何时候改变你的想法,而不用影响到这个类的任何客户。所以在Python中,尽量不要去使用Getter和setter。

    3.2K90

    set 方法是坏味道?

    setter 往往是缺乏封装的一种做法。很多人在写代码时,写完字段就会利用 Lombok 生成 getter、setter。setter 同 getter 一样,反映的都是对细节的暴露。...introduction; } @Getter 表示为这个类的字段生成 getter @Setter 表示生成 setter 因为@Setter的存在,其它代码还可以调用这个类的 setter,存在的问题并不会改变...所以,一个更好的做法是禁用@Setter。...解决可变数据,还有一个解决方案 3 编写不变类 函数式编程的不变性,其中的关键点就是设计不变类。...所有的字段只在构造函数中初始化 所有的方法都是纯函数 如果需要有改变,返回一个新的对象,而不是修改已有字段 回过头来看我们之前改动的“用构造函数消除 setter”的代码,其实就是朝着这个方向在迈进。

    36440

    java最困扰你的那些事?又将如何解决?

    负责任地说,我从不使用 Java 写程序的最大因素就是因为我恨它。还有一点就是JRE糟糕的模块化。...就算你用了一些加载工具比如Launch4j,你仍然需要让用户安装一个超过200 MB 的框架来运行程序。 没有getter、setter Java还缺少getter和setter注解。...还缺些什么 缺少宏对我来说使 Java 减分不少(我并不说在 C/C++ 中使用的预处理器宏,而是在Lisp/Scheme 中使用的那种宏)。...还是getter、setter 1、null(最大槽点)。 2、没有getter和setter注解(例如,没有属性)。 3、Java 只支持位置参数。...如果没有给变量或方法一个修饰符,那么这个方法应该是私有的,而不是包内可见。 默认的修改能力。最终类型(在所有情况下)应该是默认的,并用“var”作为修饰符。

    78250

    深入理解 Lombok 的 @Accessors 注解

    它可以与 @Getter 和 @Setter 注解结合使用,提供更灵活的访问器方法配置。这个注解可以应用于类级别或字段级别。...@Accessors 的使用 3.1 基本用法 假设有一个 Person 类,需要为其生成 getter 和 setter 方法,通常的做法如下: import lombok.Getter; import...因此,在这种情况下,显式地添加chain = true并不是必要的。...使用 @Accessors 的好处 减少样板代码:不需要手动编写大量的 getter 和 setter 方法,代码更加简洁。 提升可读性:链式和流式接口使得代码更具可读性,符合现代编程风格。...注意事项及最佳实践 与框架兼容性:有些框架依赖于标准的 getter 和 setter 方法,使用流式接口可能影响框架的正常工作。因此,在选择使用流式接口时,需要确保与项目中使用的框架兼容。

    13400

    使用 Lombok 提升编码效率

    提到 Java,很多人的第一反应就是臃肿,这主要是因为在日常编程中,我们不得不编写许多重复的代码,例如对类的属性写的 Setter、Getter 方法,下面就是一个简单的例子:public class...如果我们要在其他地方使用这个类,还需要为这个类声明访问方法,也就是 Getter 和 Setter 方法。.../Setter既然每一个类中最常见的冗余代码就是 getter 方法和 setter 方法,那么我们就来先看一下如何使用 Lombok 来处理这两个常见的冗余方法。...简单来说,我们通过注解 @Getter/@Setter 修饰 Class 的成员的这种做法,等价于为其生成 Getter 和 Setter 方法这种做法。...下面的代码所展示的,是使用注解 @Getter/@Setter 来避免 Getter 和 Setter 方法冗余的具体操作。

    10510

    如何使用IDE的代码自动生成功能提升开发效率

    引言 Java是一种强类型、面向对象的编程语言。很多时候,我们需要为类的成员变量生成getter和setter方法,或是实现toString方法以便于打印对象的状态。...传统的做法是手动编写这些方法,然而随着项目的增大,手动编写这些代码显得非常冗长且容易出错。...1.1 生成getter和setter方法 步骤: 在IntelliJ IDEA中,首先将光标放置在类名内部,确保你已经定义了类的成员变量。...如何在Eclipse中自动生成getter、setter、toString等方法 Eclipse是另一款广泛使用的Java开发工具,它同样提供了便捷的代码自动生成功能,帮助开发者快速编写常见的代码结构。...2.1 生成getter和setter方法 步骤: 在Eclipse中,右键点击类的名称或成员变量的区域。

    17710

    哪些代码设计看似是面向对象,实际是面向过程的?

    滥用 getter、setter 方法 在之前参与的项目开发中,我经常看到,有同事定义完类的属性之后,就顺手把这些属性的getter、setter 方法都定义上。...当我问起,为什么要给每个属性都定义 getter、setter 方法的时候,他们的理由一般是,为了以后可能会用到,现在事先定义好,类用起来就更加方便,而且即便用不到这些getter、setter 方法,...对于 items 这个属性,我们定义了它的getter 方法和 addItem() 方法,并没有定义它的 setter 方法。这样的设计貌似看起来没有什么问题,但实际上并不是。...正确的做法应该是,在 ShoppingCart 类中定义一个 clear() 方法,将清空购物车的业务逻辑封装在里面,透明地给调用者使用。...实际上,只包含静态方法不包含任何属性的 Utils 类,是彻彻底底的面向过程的编程风格。但这并不是说,我们就要杜绝使用 Utils 类了。

    83261

    Java GetterSetter “防坑指南”

    因此,在这篇文章里,我想深入讨论 Java 中的 getter 和 setter 方法,请跟随我一起来看看吧。 一个简单的例子 下面的代码展示了 Getter/Setter 方法的基本使用。...这种情况的解决方法是:应该返回对象的副本,而不是直接返回引用: public int[] getScores() { int[] copy = new int[this.scores.length...,你可以直接自由设置或者返回值,因为 Java 是将一个基本变量的值复制到另一个变量中,而不是复制对象的引用,因此,错误二、三都能够轻松避免。...Getter/Setter 方法 java.util.Date 类实现了 Object 类中的 clone() 方法。...或者更糟糕的是,别人可以通过隐式操纵 Getter 或者 Setter 的参数并从中获取对象来轻易地“蹂躏”你的程序。 请小心使用,避免踩坑。

    1.3K40

    Java中的POJO是什么?

    但是,我们没有遵循任何真正的约定来构造、访问或修改类的状态。这种缺乏惯例的做法造成了两个问题: 1)如何使用它需要理解一下。...2)它可能会限制框架对其支持约定而不是配置、理解如何使用类以及增强其功能的能力。 为了探索第二点,让我们使用反射来处理EmployeePojo。因此,我们将开始发现它的一些局限性。...JavaBean仍然是一个POJO,但围绕如何实现它引入了一组严格的规则: 访问级别—要求属性是私有的,并暴露公开getter和setter方法。...方法名–getter和setter遵循getX和setX约定(对于布尔值,isX可以用于getter) 默认构造函数–必须存在无参数构造函数,以便在不提供参数的情况下创建实例,例如在反序列化期间 Serializable...在使用JavaBeans时,我们还应该注意一些潜在的缺点: 可变性–JavaBean由于其setter方法而具有可变性–这可能会导致并发性或一致性问题 样板文件–我们必须为所有属性引入getter,为大多数属性引入

    1.3K10

    禁止触摸_lombok插件

    、@Getter、@Setter和@RequiredArgsConstrutor这些注解,对于POJO类十分有用。...即自动帮忙给例子中的Menu类中定义了toString、Getter、Setter等方法。 通过上面的例子,大家可以发现,我们是使用@Data注解大大减少了代码量,使代码非常简洁。...如果我们在代码中直接使用Lombok,那么他会自动帮我们生成getter、setter 等方法,这就意味着,一个类中的所有参数都自动提供了设置和读取方法。...而面向对象封装的定义是:通过访问权限控制,隐藏内部数据,外部仅能通过类提供的有限的接口访问、修改内部数据。所以,暴露不应该暴露的 setter 方法,明显违反了面向对象的封装特性。...好的做法应该是不提供getter/setter,而是只提供一个public的addItem方法,同时取修改itemsCount、totalPrice以及items三个属性。

    54850

    面经之《招聘一个靠谱的iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

    ivar、getter、setter 是如何生成并添加到这个类中的 @property 的本质是什么?...其中,“获取方法” (getter)用于读取变量值,而“设置方法” (setter)用于写入变量值。这个概念已经定型,并且经由“属性”这一特性而成为 Objective-C 2.0 的一部分。...同时重写了 setter 和 getter 时 重写了只读属性的 getter 时 使用了 @dynamic 时 在 @protocol 中定义的所有属性 在 category 中定义的所有属性...他们两个的不同点在于:super 会告诉编译器,调用 class 这个方法时,要去父类的方法,而不是本类里的。...当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,则从父类的方法列表中开始找。然后调用父类的这个方法。

    1K100

    OOP三大特性之封装

    即便我们把对象理解成数据+函数,数据、函数也不是对等的: 函数是接口 接口是稳定的 数据是内部的实现 实现是易变的,应该隐藏 很多人的开发习惯:写一个类,写其一堆字段,然后生成一堆getter、setter...这种做法是错误的,它把数据当成设计核心,这一堆getter、setter,就等于暴露实现细节。...关于setter: 大概率是你用错名字,应该用一个表达意图的名字 setter通常意味着修改,这是不推荐的 可变的对象会带来很多的问题,后续再深入讨论。所以,设计中更好的做法是设计不变类。...Lombok很好,少写很多代码,但必须限制它的使用,像Data和Setter都不该用。Java Bean本来也不是应该用在所有情况下的技术,导致很多人误用。...整个类里都是 getter、setter 的事情也做过,这就像是用“面向对象的语言写面向过程的代码”。 参考 https://www2.ccs.neu.edu/research/demeter/

    50020

    OC知识--成员变量(属性,实例变量)的相关知识

    成员变量特点 成员变量只能通过对象来访问 成员变量不能离开类,离开类之后就不是成员变量 成员变量不能再定义的同时进行初始化 成员变量存储在当前对象对应的堆的存储空间中,不会被自动释放,只能手动释放 成员变量前加下划线...这样写的好处在下边会提到 2. setter和getter方法 我们无法从外界(比如其他类和文件中)直接访问定义在类中的成员变量。...如果内部的成员变量,只允许外界读取,但是不允许修改,则通常只提供getter方法而不提供setter方法 成员变量名的命名以下划线开头,setter和getter方法名不需要带下划线 成员变量名使用下划线开头有两个好处...点语法注意 点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法调用 如果没有setter和getter方法,则不能使用点语法 不要在setter与getter方法中使用本属性的点语法..., 也就是说是在.m文件中生成的, 而不是在.h文件中生成的。

    2.5K60

    Kotlin Vocabulary | Kotlin 委托代理

    有时候,完成一些工作的方法是将它们委托给别人。这里不是在建议您将自己的工作委托给朋友去做,而是在说将一个对象的工作委托给另一个对象。 当然,委托在软件行业不是什么新鲜名词。...由于新的类继承了具体的 ArrayList 类而不是实现 MutableList 接口,因此它与 ArrayList 的实现高度耦合。...通过使用类代理,您的类可以不继承于任何类。相反,它会与其内部的源类型对象共享相同的接口,并对该对象进行装饰。这意味着您可以轻松切换实现而不会破坏公共 API。...通过使用属性代理,我们可以将 getter 和 setter 委托给属性,从而可以复用代码。 与类代理相同,您可以使用 by 来代理一个属性,Kotlin 会在您使用属性语法时生成代码来使用代理。...如果您只需要委托 getter,那么代理类需要实现 ReadProperty;而如果 getter 与 setter 都要委托,则代理类需要实现 ReadWriteProperty。

    2K20

    Objective-C属性(property)的特性(attribute)

    用Objective-C做过开发的朋友都知道,类里面的属性(可以近似地理解为类的变量)是用@property关键字定义的,然后@property后面的括号,会写上若干「特性(attribute)」,后面跟数据类型...然而,即使不使用setter和getter,其他类也可以通过->来直接访问,如: personA->name = @"123"; NSLog(@"personA->name:%@", personA...因此,写getter和setter,可算是Objective-C中「约定俗成」的做法了。...atomic(默认值) 使用atomic,在一定程度上可以保证线程安全,「atomic的作用只是给getter和setter加了个锁」。...如果设置为null_resettable,则要重写setter或getter其中之一,自己做判断,确保真正返回的值不是nil。

    2K30

    Objective-c 知识总结 -- @property

    setter、getter 方法(readwrite、readonly) // 情况 1 readwrite,必须要同时编写 setter、getter 方法 @property (nonatomic...return _age; } ////// 此处程序员手动编写的 setter 、getter 方法必须要严格按照 存取方法的命名要求进行编写: setter --> setValueName:..._age); } @end 那个警告明显是说,我自动合成的实例变量是__age,而不是 _age,所以你应该定义一个 __age 的实例变量才对,不然我就警告你; 其实这里是间接地证明了,如果你自己定义了相应的带下划线的实例变量...setter 、getter 方法的区别: assign 与 unsafe_unretained 变量直接赋值 assign 可用于 MRC/ARC ,而 unsafe_unretained 只能用于...setter 可以是 nil,但 getter 不能返回nil; 重写 setter 或 getter 方法,警告都会取消,但是正确的做法是重写 getter 方法处理返回 nil 的情况; Ep: #

    1.4K31
    领券