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

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

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

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

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

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

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

相关·内容

Getter & Setter使用还是废弃

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

1.3K60

TW洞见〡gettersetter那些事

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

88360
  • Java 最困扰你那些事

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

    84680

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

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

    3.2K90

    set 方法是坏味道?

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

    35640

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

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

    77550

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

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

    78461

    Java GetterSetter “防坑指南”

    因此,在这篇文章里,我想深入讨论 Java 中 gettersetter 方法,请跟随我一起来看看吧。 一个简单例子 下面的代码展示了 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,但围绕如何实现它引入了一组严格规则: 访问级别—要求属性是私有的,并暴露公开gettersetter方法。...方法名–gettersetter遵循getX和setX约定(对于布尔值,isX可以用于getter) 默认构造函数–必须存在无参数构造函数,以便在不提供参数情况下创建实例,例如在反序列化期间 Serializable...在使用JavaBeans时,我们还应该注意一些潜在缺点: 可变性–JavaBean由于其setter方法具有可变性–这可能会导致并发性或一致性问题 样板文件–我们必须为所有属性引入getter,为大多数属性引入

    1.3K10

    禁止触摸_lombok插件

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

    54050

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

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

    1K100

    OOP三大特性之封装

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

    48920

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

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

    2.5K60

    Kotlin Vocabulary | Kotlin 委托代理

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

    2K20

    Objective-c 知识总结 -- @property

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

    1.4K31

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

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

    1.9K30

    对比java和python

    Java静态方法惯用翻译通常翻译成一个模块级函数,不是一个方法或静态方法。(并且静态常量应该翻译成模块级常量.) ...有一点一定要注意:调用一个方法需要一个额外存储空间,调用静态方法或函数就不需要这样....Python编程语言对象不是Java Bean。不要写什么gettersetter,而是还把它们内置在“属性”里面。...在Java中,你必须使用gettersetter,因为公共字段不允许你以后改变想法再去使用gettersetter。...所以不要写gettersetter方法。 ◆代码重复在Java中通常来说就是一场不可避免灾祸,你必须经常反复地写同一个方法只有一点点变化(通常是这是因为静态类型约束)。

    1.4K40

    PyCharm插件开发实践-PyGetterAndSetter

    背景需求 在面向对象设计中,典型如Java语言,为了控制对象属性修改入口,我们常用做法是把属性设置为private,然后通过gettersetter方法访问、修改该属性。...为了良好设计规范,我们可以规定,在Python中,所有的对象属性均以下划线"_"前缀开头,同时编写该属性gettersetter方法,在其他地方引用时候,禁止出现直接引用。...大量gettersetter方法,很耗费精力,所以需要一款插件来辅助自动化生成Python对象属性gettersetter方法。...拼装方法 Python中gettersetter方法都非常简单,我们可以先创造一个模板: // 定义GetterSetter模板 String getterTemplate..._var = var; 可以看到在self.xxx中需要使用变量,而在get_xxx和setter参数中,需要删除对应下划线。

    1.8K10

    Lombok使用

    比如编写POJO时需要为每个属性提供getter()方法和setter()方法,这就可以使用Lombok实现。...Lombok最大优点就是不用编写大量版式代码,比如我们项目中有许多POJO,那么为每个pojo编写getter()、setter()、toString()方法是非常枯燥事情,虽然可以使用IDE自带代码生成工具来生成这些方法...但这不是绝对,如果属性是布尔类型,那么生成方法是isXxx()不是getXxx()。 3.3  @Log 日志注解,注解在上。可以使用日志注释对任何进行注释,以使lombok生成记录器字段。...注意:没有setter()方法 3.12  @Data 注解在上,该注解是最常用注解,它结合了@ToString,@EqualsAndHashCode, @Getter和@Setter。...本质上使用@Data注解,默认有@ToString和@EqualsAndHashCode以及每个字段都有@Setter和@Getter

    85710
    领券