当前位置: 首页 > news >正文

C++ 中两个类之间的通信方式

C++ 中两个类之间的通信

在 C++ 中,两个类之间可以通过多种方式进行通信。以下是几种常见的方法:

1. 包含/组合(Composition)

一个类包含另一个类的对象作为成员:

class ClassB {
public:void methodB() {cout << "ClassB method" << endl;}
};class ClassA {
private:ClassB b;  // ClassA 包含 ClassB 对象
public:void methodA() {b.methodB();  // 调用 ClassB 的方法}
};

2. 指针/引用成员

一个类持有另一个类的指针或引用:

class ClassB {
public:void methodB() { /* ... */ }
};class ClassA {
private:ClassB* bPtr;  // 指针成员
public:ClassA(ClassB* b) : bPtr(b) {}void methodA() {bPtr->methodB();}
};

3. 友元类(Friend Class)

使用 friend 关键字允许一个类访问另一个类的私有成员:

class ClassB {
private:int secretData;friend class ClassA;  // 声明 ClassA 为友元
};class ClassA {
public:void accessB(ClassB& b) {b.secretData = 42;  // 可以访问 ClassB 的私有成员}
};

4. 通过参数传递

通过方法参数传递对象:

class ClassB {
public:void methodB() { /* ... */ }
};class ClassA {
public:void callB(ClassB& b) {b.methodB();}
};

5. 观察者模式(Observer Pattern)

用于实现发布-订阅机制:

#include <vector>
#include <algorithm>class Observer {
public:virtual void update() = 0;
};class Subject {
private:std::vector<Observer*> observers;
public:void attach(Observer* obs) {observers.push_back(obs);}void notify() {for (auto obs : observers) {obs->update();}}
};class ConcreteObserver : public Observer {
public:void update() override {cout << "Received update notification" << endl;}
};

6. 中介者模式(Mediator Pattern)

通过中介者类来协调多个类之间的通信:

class Mediator;  // 前向声明class Colleague {
protected:Mediator* mediator;
public:Colleague(Mediator* m) : mediator(m) {}
};class Mediator {
public:virtual void notify(Colleague* sender, std::string event) = 0;
};class ConcreteColleagueA : public Colleague {
public:ConcreteColleagueA(Mediator* m) : Colleague(m) {}void doSomething() {mediator->notify(this, "Event from A");}
};

选择建议

  • 对于简单关系,使用组合或参数传递

  • 需要访问私有成员时考虑友元(但应谨慎使用)

  • 对于复杂通信或解耦需求,考虑观察者或中介者模式

  • 避免过度使用友元,因为它会破坏封装性

每种方法都有其适用场景,应根据具体需求选择最合适的通信方式。

http://www.lryc.cn/news/589670.html

相关文章:

  • Linux 文件系统实现层详解:原理、结构与驱动衔接
  • C++回顾 Day7
  • 企业级实时流处理:Kafka Streams完整解决方案
  • 基于Springboot+UniApp+Ai实现模拟面试小工具五:权限校验参数校验及日志功能实现
  • 从抽象函数到可计算导数 ——SymPy 中占位、求导、代入的完整闭环
  • OpenAI GPT-4o技术详解:全能多模态模型的架构革新与生态影响
  • AJAX 开发中的注意点
  • cursor使用mcp连接mysql数据库,url方式
  • Python 程序设计讲义(1):PyCharm 安装教程
  • 网络基础10 业务访问控制--ACL与包过滤
  • HarmonyOS-ArkUI: Web组件加载流程1
  • 隐私计算四大主流开源框架:从学术研究到工业落地,附PySyft实战Demo
  • 【PTA数据结构 | C语言版】根据层序序列重构二叉树
  • 【PTA数据结构 | C语言版】前序遍历二叉树
  • 【UniApp】Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass
  • 快速了解 HTTPS
  • 使用JS编写动态表格
  • ES2023 新特性解析_数组与对象的现代化操作指南
  • ffmpeg音视频处理大纲
  • 【删库跑路】一次删除pip的所有第三方库
  • Python语法入门之装饰器的基本用法
  • 21-C#的委托简单使用-1
  • 移动碰撞法 ——套料排版算法——CAD c#
  • 一文读懂循环神经网络—门控循环单元
  • Agentic AI 的威胁与缓解措施
  • 李白周游记50篇
  • MySQL锁机制与SQL优化详解
  • 学习C++、QT---26(QT中实现记事本项目实现文件路径的提示、C++类模板、记事本的行高亮的操作的讲解)
  • 应用部署作业-02-流程
  • C++-linux系统编程 8.进程(二)exec函数族详解