当前位置: 首页 > 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://catchlight.dmyyro.cn
http://cheka.dmyyro.cn
http://aerolitics.dmyyro.cn
http://bajree.dmyyro.cn
http://canasta.dmyyro.cn
http://briskness.dmyyro.cn
http://asthenia.dmyyro.cn
http://apocalypse.dmyyro.cn
http://antehuman.dmyyro.cn
http://boneset.dmyyro.cn
http://chicano.dmyyro.cn
http://aroynt.dmyyro.cn
http://barcelona.dmyyro.cn
http://bahai.dmyyro.cn
http://cac.dmyyro.cn
http://bey.dmyyro.cn
http://apse.dmyyro.cn
http://beaty.dmyyro.cn
http://bawdyhouse.dmyyro.cn
http://absorptance.dmyyro.cn
http://anticlimactic.dmyyro.cn
http://airwash.dmyyro.cn
http://airmobile.dmyyro.cn
http://chromascope.dmyyro.cn
http://cholinomimetic.dmyyro.cn
http://believer.dmyyro.cn
http://choush.dmyyro.cn
http://careerist.dmyyro.cn
http://burglar.dmyyro.cn
http://biocritical.dmyyro.cn
http://www.dtcms.com/a/280944.html

相关文章:

  • labview关于OOP
  • labview生成exe应用程序常见问题
  • Java行为型模式---责任链模式
  • redis集群的部署
  • 渭河SQL题库-- 来自渭河数据分析
  • JavaScript与Vue:现代前端开发的完美组合
  • King’s LIMS:实验室数字化转型的智能高效之选
  • AWS S3事件通知实战:从配置到生产的完整指南
  • 云蝠智能赋能呼入场景——重构企业电话服务
  • JVM——为什么Java8移除了永久代(PermGen)并引入了元空间(Metaspace)?
  • 订单初版—7.支付和履约实现的重构文档
  • 域名备案是否可以加急
  • DirectX12(D3D12)基础教程九 间接绘制
  • Dynadot邮箱工具指南(十二):删除域名邮箱
  • 学习软件测试的第十六天
  • C++ Qt插件开发样例
  • Git Bash 实战操作全解析:从初始化到版本管理的每一步细节
  • 读取和写入json,xml文件
  • Kubernetes 架构原理与集群环境部署
  • Codeforces Round 907 (Div. 2) F. A Growing Tree(2000,子树修改)
  • 拥抱 Spring Boot:开启 Java 后端开发的“快车道”
  • MySQL功能模块探秘:数据库世界的奇妙之旅
  • 解决了困扰我的upload靶场无法解析phtml等后缀的问题
  • JAVA学习笔记 使用notepad++开发JAVA-003
  • SpringBoot 3.x集成阿里云OSS:文件上传 断点续传 权限控制
  • 填补空白!openKylin率先完成RISC-V商业打印驱动全适配
  • AI问答-Token:在人工智能领域,Token 是模型处理文本的核心单元 / 最小可处理片段
  • Python打卡训练营Day58
  • 大白话解释一下RTC实时时钟
  • 【机器学习深度学习】大模型推理速度与私有化部署的价值分析