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

有没有办法设计两个私有操纵彼此数据的类?

有的,可以设计两个私有操纵彼此数据的类。这种设计模式通常称为“友元类”(Friend Class)。在友元类中,一个类可以将其私有成员暴露给另一个类,使得另一个类可以访问和操作这些私有成员。

以下是一个简单的示例:

代码语言:cpp
复制
class ClassA;

class ClassB {
public:
    void setData(int data) {
        m_data = data;
    }

    void manipulateData(ClassA& obj);

private:
    int m_data;
};

class ClassA {
public:
    void setData(int data) {
        m_data = data;
    }

    void manipulateData(ClassB& obj);

private:
    int m_data;

    // 声明 ClassB 为友元类
    friend class ClassB;
};

void ClassB::manipulateData(ClassA& obj) {
    // 访问 ClassA 的私有成员
    obj.m_data *= 2;
}

void ClassA::manipulateData(ClassB& obj) {
    // 访问 ClassB 的私有成员
    obj.m_data += 10;
}

在这个示例中,ClassAClassB 互相访问彼此的私有成员,并在各自的公有成员函数中操纵彼此的数据。通过使用友元类,我们可以实现两个类之间的紧密协作,而不必暴露类的内部实现细节。

需要注意的是,友元类的使用应该适度,过度使用可能会导致代码难以维护和理解。在设计类时,应该尽量使用封装、继承和多态等面向对象的基本原则来实现类之间的交互。

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

相关·内容

面试官:说说反射底层实现原理?

所以本文就通过大白话方式来系统讲解一下反射,希望大家看完之后能真正理解并掌握“反射”这项技术。1.什么是反射?反射在程序运行期间动态获取操纵一种技术。...JDBC 连接:JDBC 中 DriverManager 通过反射加载并注册数据库驱动,这是 Java 数据库连接标准做法。...().newInstance();// 5.执行私有方法privateMethod.invoke(user);4.底层实现原理从上述内容可以看出,对于反射来说,操纵最主要方法是 invoke,所以搞懂了...因此,在使用反射时需要格外小心,确保不会对程序安全性造成影响。课后思考为什么反射执行效率比较低?动态代理实现除了反射之外,还有没有其他实现方法?...、MyBatis、设计模式、消息队列等模块。

10010

服务读写分离架构,绝不推荐

完全打破了“服务化数据私有微服务初衷 两个服务因为同一份数据库资源访问而耦合在一起,当数据库资源发生变化时候(例如:ip变化,域名变化,表结构变化,水平切分变化等),有两个依赖点需要修改。...因为,写服务修改数据库时,缓存中数据没有办法得到淘汰!!! OK,有朋友说,写数据库之前,可以由写服务来淘汰缓存: 即,读服务与写服务都可以操作缓存。...额,这个设计,又违背了“服务化缓存私有微服务初衷,两个服务因为同一份缓存资源访问而耦合在一起,当缓存资源发生变化时候,有两个依赖点需要修改。...况且,如果真的两个服务访问相同数据库和缓存,为什么不合成一个服务呢? 硬要拆成两个服务,不是自己玩自己么?...OK,有另外朋友说,可以由写服务发消息来淘汰缓存: 如上图: a)缓存私有,只有读服务操纵缓存 b)数据库发生写请求时,写服务给MQ发消息,由读服务来淘汰缓存 这种设计: a)读服务来淘汰缓存,本质是一个写请求

2.4K110

23种设计模式之备忘录模式

场景: ? 备忘录模式应用 备忘录模式使用场景: 需要保存和恢复数据相关状态场景 提供一个可回滚操作 需要监控副本场景中....程序精简了很多. 2.多状态备忘录模式 当状态有很多个时候, 将状态一个一个写当然不是一个好办法, 那样要写大量代码, 还容易犯错误....在这里, 使用了一个新设计方法: 双接口设计, 我们一个可以实现多个接口, 在系统设计时, 如果考虑对象安全问题, 则可以提供两个接口, 一个是业务正常接口, 实现必要业务逻辑,叫做宽接口;...另外一个是一个空接口, 什么方法都没有, 其目的是提供给子系统外模块访问, 比如容器对象,这个叫做窄接口, 由于窄接口中没有提供任何操纵数据方法, 因此相对来说比较安全 ---- 在设计时候不要使用数据临时表作为缓存备份数据了..., 虽然是一个简单办法,但是它加大了数据库操作频繁度, 把压力下放到数据库了, 最好解决办法就是使用备忘录模式.

29260

读服务+写服务分离架构,我坚决反对!

第四点:完全打破了“服务化数据私有微服务初衷。 画外音:数据访问,应该收口。...因为,写服务修改数据库时,缓存中数据没有办法得到淘汰!!! OK,有朋友说,写数据库之前,可以由写服务来淘汰缓存: ? 即,读服务与写服务都可以操作缓存。...额,这个设计,又违背了“服务化缓存私有微服务初衷,两个服务因为同一份缓存资源访问而耦合在一起,当缓存资源发生变化时候,有两个依赖点需要修改。 画外音:缓存访问,应该收口。...如上图: (1)缓存私有,只有读服务操纵缓存; (2)数据库发生写请求时,写服务给MQ发消息,由读服务来淘汰缓存; 这种设计: (1)读服务来淘汰缓存,本质是一个写请求,不是很奇怪么?...(1)调用方不蒙圈,不纠结; (2)好维护; (3)数据库,缓存私有,无耦合; 总的来说,个人意见是: 互联网微服务架构,建议按照“子业务”进行微服务拆分,而不应该按照“读写”来进行微服务拆分,避免过度设计

38430

Java中ThreadLocal功能演示

在进行性能测试用例编写过程中,比较简单办法就是直接使用synchronized关键字,修饰对象、方法以及。但是使用synchronized同步,这可能会影响应用程序可伸缩性以及运行效率。...由于不需要修改任何方法,因此可以提供极大灵活性。 没有两个线程可以看到彼此ThreadLocal变量。...ThreadLocal通常与Thread一起使用,由Thread执行所有代码都可以访问ThreadLocal变量,但是两个线程看不到彼此ThreadLocal变量。...Java中ThreadLocal变量通常是私有静态字段,并在Thread中维护其状态。 不要误解ThreadLocal是Synchronization替代方法,它全部取决于你自己程序设计。...如果设计允许每个线程拥有自己对象副本,则可以使用ThreadLocal。 项目中使用 这里一个处理requestid,通过ThreadLocal使用,可以保证每个请求都拥有唯一一个追踪标记。

44220

吹弹牛皮之低耦合程序设计

设计模式之单一职责原则 高内聚和低耦合通常是密不可分,面向对象本质是对对象抽象,又是对对象抽象结果具体表达。对于一个而言应该尽可能让你成为一个或者一对象。...从而达到了高内聚低耦合设计目的。 2. 设计模式之迪米特法则 很多情况下,我们之间,模块功能与模块功能之间是需要沟通去功能完成一些职责。...内容如下: 这就需要我们在结构设计上,每一个都应当尽量降低成员访问权限。两个或者模块之间只通过编写接口方法供其调用。这样就会使得耦合变弱更利于复用。 3....它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开 MVC架构模式虽然会让功能由一个变成了三个,但对于修改和拓展还是有很大方便。...反射 尽管我们有了以上手段但仍然没有完全避免接触耦合办法有没有想抖音搭讪段子那样(嗨,美女,结婚吗?)一步到位呢。回答是有的,而这种技术就叫做反射。反射反射程序员快乐!

50550

和比特币关系最紧密技术:区块链原来是这么玩

因为它所带来去中心化思路,会对我整个架构设计思路产生影响,在这种情况下应该如何设计软件?...,通过体验心情地图和设计挑战改善你产品设计和用户体验。...我刚才也说两个流派,第一个流派,认为我作为现实中一定会发生错误,一定是有包括监管需要,特别像中国场景会更明显一些,如果技术不提供监管和改数据能力,可能政府都不会放行。...提问三:我想问一下,公有链、私有链,现在还有一个联盟链。我简单理解联盟链就是几个私有链加在一起? 刘尚奇:私有链,我是一个组织,在组织内部,组织内部即使不用区块链,你也是有足够信任度。...,没有办法确认你加是一百块钱,不是两百块钱,我们需要像 vasa 这样中介。

72450

PHP设计模式之单例模式定义与用法分析

缺点: 1.不适用于变化对象,如果同一对象总是要在不同用例场景发生变化,单例就会引起数据错误,不能保存彼此状态。 2.由于单利模式中没有抽象层,因此单例扩展有很大困难。...4.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计单例,可能会导致共享连接池对象程序过多而出现连接池溢出;如果实例化对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态丢失...也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同,比如在Java中单例会一直存在于整个应用程序生命周期里,变量是跨页面级,真正可以做到这个实例在应用程序生命周期中唯一性...比如 1.应用程序与数据库交互 一个应用中会存在大量数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量new操作,因为每一次new操作都会消耗内存资源和系统资源。...2.控制配置信息 如果系统中需要有一个来全局控制某些配置信息, 那么使用单例模式可以很方便实现 更多关于PHP相关内容感兴趣读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array

41731

金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之二:ThreadLocal和Valotile

ThreadLocal和Valotile是两个比较常见知识点,虽然简单,但是能从一定程度上考察一个程序员,对多线程环境下,线程通信和数据安全认知。...办法当然不止一                种,并发包AtomicXXX一样能达到这个效果,原理,差不多,无非是通过锁来实现并发。那么还有没有其他思路呢?...当然,并不能因为此就认为是弱引用导致内存泄露,而应该是,设计这个变量存储机制,导致了泄露。所以在使用时候,要及时释放(通过以上描述,你肯定已经想到怎么合理释放了吧?)...就是因为这么一个++操作,被编译为指令    后,是多个指令来完成。那么遇到并发情况,就会导致彼此“覆盖”情况。        ...究其原理,是cpu不是直        接 和系统内存通信,而是把变量读取到L1,L2等内部缓存中,也叫作私有数据工作栈。

61040

SIGIR23 微信 | 预训练推荐方法中后门攻击

具体而言,本文设计两个新颖有效后门攻击:基础替换(basic replacement)方法和提示增强(prompt-enhanced)方法,应用于各种推荐系统预训练场景。...实际上,除了替换item之外,这些序列都是由真实用户创建。 还可以通过概率和相似度度量平衡攻击效果和推荐效果。 在本文中,我们将同一别下项目视为相似项目。...实验证明prompt有效性,尤其是在用户组攻击中。 然而通常情况下,平台会根据自己私有数据进行提示训练。...在这种情况下,由于模型提供者(攻击者)不知道提示参数和平台私有数据,实施提示增强攻击具有挑战性,实验也表明联合训练无效性。...经过三步训练后,我们将后门(backdoor)植入到预训练模型中。平台对其私有数据进行及时调优后,就会触发后门。 3 实验结果

31650

String 不可变真的是因为 final 吗?

是因为 Java 作者在 String 所有方法里面,都很小心地避免去修改了 char 数组中数据,涉及到对 char 数组中数据进行修改操作全部都会重新创建一个 String 对象。...作为最基础最常用数据类型,String 被许多 Java 库用来作为参数,如果 String 不是固定不变,将会引起各种安全隐患。...于是,糟糕事情发生了,HashSet 中出现了两个相等元素,破坏了 HashSet 不包含重复元素原则。...想要改变 String 无非就是改变 char 数组 value 内容,而 value 是私有属性,那么在 Java 中有没有某种手段可以访问私有属性呢?...简单办法是将声明为 final,更好方法是将构造函数声明为私有的,通过工厂方法创建对象; 如果类字段是对可变对象引用,不允许修改被引用对象。 点击进入小牛肉留言板 ?

55730

设计模式学习笔记之单例模式

单例模式实现 单例模式核心代码:构造函数私有化,提供对外访问方式。...假定不是远端存取,例如一些servlet容器对每个servlet使用完全不同装载器,这样的话如果有两个servlet访问一个单例,它们就都会有各自实例。...^1 对第一个问题修复办法是: private static Class getClass(String classname) throws ClassNotFoundException {...^3 缺点: 1.不适用于变化对象,如果同一对象总是要在不同用例场景发生变化,单例就会引起数据错误,不能保存彼此状态。...4.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计单例,可能会导致共享连接池对象程序过多而出现连接池溢出;如果实例化对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态丢失

29140

「MoreThanJava」Day 4:面向对象基础

传统结构化程序设计通过设计一系列过程 (即算法) 来求解问题。一旦确定了这些过程,就要开始考虑存储数据适当方式。...(这也是 Private 私有本身含义) 注意:虽然可以用 public 标记实例字段,但这是一种很不好做法。...假设我们有两个,男人正在辛苦挣钱并时不时地查看余额,而此时来了一个小偷,专门偷男人钱,逮着一个偷一个,而被偷了之后男人抓到了小偷,此时由于小偷钱是私有的,男人抓着小偷咬牙切齿却没有丝毫办法可以把钱拿回来...(英文句号) 来连接方法并调用: dog.eat(); // 调用该实例 eat() 方法 Java 使用引用来操纵对象 每种编程语言都有自己操纵内存中元素方式。...有时候,程序员必须注意将要处理数据是什么类型。你是直接操纵元素,还是用某种基于特殊语法间接表示 (例如 C 和 C++ 里指针) 来操纵对象?

40630

面向对象设计里引入 Friend 是对封装性破坏吗,friend 在 SAP ABAP 里应用场景

friend 机制是一种面向对象设计模式,它允许对象之间共享私有信息,并且只有指定对象才能访问这些信息。...如果对象之间需要共享一些私有信息,通常最好方法是通过公共接口来实现。如果两个对象必须彼此知道对方实现细节,这可能意味着它们之间存在过度耦合问题,需要进行重新设计。...此外,friend 机制使用可能会导致代码更加难以理解和维护。 在面向对象设计领域中,封装是一种将数据和操作它们方法组合在一起方式,目的是隐藏对象内部实现细节。...然而,尽管friend机制可能会削弱封装性,但在某些情况下,它仍然是有用。在以下场景中,使用friend机制可能是有益: 当两个或多个紧密相关需要共享某些数据或功能时。...在软件测试中,我们可能需要访问私有成员来验证其正确性。通过将测试或测试函数声明为待测友元,我们可以更容易地访问这些私有成员,从而编写更全面的测试用例。

25330

云巨头决战混合云 新一轮产业竞争爆发

最近,IBM公司宣布其收购Softlayer混合云服务也已经获得了很多用户,微软公司也称其是唯一能够提供私有、公有和混合云厂商。 IDC预测数据显示,未来混合云将占据整个云市场67%。...混合云热度升温,引发新一轮产业竞争,厂商之间彼此关于“真假”混合云争论“口水战”也不断升级。在这样背景下,用户应该如何选择?究竟混合云难点在哪里?市场上哪些厂商能够真正提供混合云?...但我们必须在考虑数据安全和数据可控性同时,兼顾数据共享性,所以选择一部分放在私有云上,一部分放在公有云上。我们对云技术利用必须选择混合云。”...,有没有做过混合云比较成功先例;二是要看对方设计理念是否与自己需求相吻合。...王枫认为,用户对于混合云采用应该从以下方面进行考量:需要考虑供应商是否具备在公有云、私有云等方面的经验;是否在架构设计与应用开发上有相应经验,尤其是需要具备在不同分布式节点上实现集成、开发等相应经验

61350

【JAVA】不会有人不知道 Java 能够在运行时动态生成吧?

有一种笨办法,直接用 ProcessBuilder 之类启动 javac 进程,并指定上面生成文件作为输入,进行编译。最后,再利用加载器,在运行时加载即可。...前面的方法,本质上还是在当前程序进程之外编译,那么还有没有不这么 low 办法呢?...我们能不能直接生成相应字节码,然后交给加载器去加载呢?当然也可以,不过直接去写字节码难度太大,通常我们可以利用 Java 字节码操纵工具和库来实现.  ...java.nio.ByteBuffer b, ProtectionDomain protectionDomain) 这里只选取了最基础两个典型...cw.toByteArray(); 然后,就可以进入我们熟知加载过程了; 最后一个问题,字节码操纵技术,除了动态代理,还可以应用在什么地方?

28420

IP地址到底是什么?

,于是,为了提高效率,有人想到了一个好办法,我们在两台电脑之间插上数据线,通过数据线进行数据交互 有了这根数据线,或者叫网线,这个两台电脑就能进行数据交互了,但是,如果不止有两台电脑呢?...四、局域网到广域网 通过交换机,我们可以让连接到交换机计算机进行数据交流,假如这几台机器是你学校电脑,你学校想和隔壁学校进行业务盒子,就需要彼此电脑也进行数据交流,正好隔壁电脑也是用交换机进行数据交流...,于是我们只要把两个学校交换机连接,那两边电脑就能相互访问了。...就是这样,交换机越来越多,知道覆盖全世界,你只需进入其中任意一个节点,就能访问到全世界任意一条同样连接到网络设计,这就构成了广域网。 你可以理解为: 广域网就是无数局域网结合。...现在知道为什么很多 ip 都是 192.168 开头了吧?因为这是挂载到了一个小中转设备下 C 私有 ip, 在这个私 IP 下依赖转换器公网 IP 上网。

72730

设计模式实战 - 中介者模式

,软件产品也有库存,虽然不需要占用库房空间,但也要占用光盘或硬盘,这也是库存 就来讲讲它原理和设计,一般做法都是通过数据库来完成相关产品管理 ?...image 运行结果也是我们期望,三个不同类型参与者完成了各自活动 你有没有发现这三个彼此关联?...从这方面来说,我们已经发现设计缺陷了,作为一个SE,发现缺陷就要想办法修改。 网络拓扑有三种类型:总线型、环型、星型 星型网络拓扑 ?...,设计结构清晰了很多,而且耦合性大大减少,代码质量也有了很大提升。...如果没有机场调度中心,飞机飞到机场了,飞行员要先看看有没有飞机和自己一起降落有没有空跑道,停机位是否具备等情况,这种局面是难以想象

82051

靠默契保证私有制:Python 中私有

__age = 10 上面的代码定义了一个 Person , 有 __age 表示年龄属性。神奇事情发生了: >> p = Person() >> p....噢耶,私有制完成。这个现象原理简单明了:以 __ 打头并且不以 __ 结尾属性变量,都会自动更名为 _名__变量名。比如上面的 __age 实际名字是 _Person__age。...所以这个私有制是建立在开发者之间默契基础上:“你既然这么设计了,说明这个变量你不希望我访问或者修改,那我就不访问或者修改了”,并不是建立在强制力基础上。 2....p.lessons ["Chinese","English","Math"] >> p.lessons[0] = "CS" >> p.lessons ["CS","English","Math"] 解决这个问题办法就是用...给玩家 AI 信息必须进行访问权限控制,那么玩家 AI 有可能通过信息获取游戏秘密或者操纵游戏。 ? 为了实现这个目的,之前做法是深度拷贝游戏环境给出信息。

65280
领券