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

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.xdnf.cn/news/15442.html

相关文章:

  • 元宇宙经济:虚实交融下的数字文明新范式
  • python学习---dayday6
  • Redis中的红锁
  • 人机协作系列(四)AI编程的下一个范式革命——看Factory AI如何重构软件工程?
  • 牛客:HJ21 简单密码[华为机考][哈希]
  • C++ -- STL-- List
  • 游戏加速器核心技术:动态超发
  • 【Linux】线程创建等待终止分离
  • 力扣25.7.15每日一题——有效单词
  • Vue框架之模板语法(插值表达式、指令系统、事件处理和表单绑定)全面解析
  • CSS的初步学习
  • 课题学习笔记1——文本问答与信息抽取关键技术研究论文阅读(用于无结构化文本问答的文本生成技术)
  • elasticsearch 下载/安装
  • AJAX 入门到精通
  • 60V/3A高效同步降压转换器替代LM2576只需4个元器件
  • 终端安全管理系统为什么需要使用,企业需要的桌面管理软件
  • Video Python(Pyav)解码一
  • MongoDB基础增删改查命令
  • CSS :root伪类详解:实现动态主题切换的关键所在
  • CAS单点登录架构详解
  • 从零构建鸿蒙应用:深度解析应用架构与项目结构
  • linux 内核: 遍历当前所有进程
  • AR眼镜:重塑医学教育,开启智能教学新时代
  • 图像修复:深度学习实现老照片划痕修复+老照片上色
  • 物联网系统中MQTT设备数据的保存方法
  • HC595串转并
  • CUDA 环境下 `libcuda.so` 缺失问题解决方案
  • linux网络编程之单reactor模型(二)
  • 僵尸进程Zombie Process
  • Java核心类库深度解析与实战:从字符串处理到计算器开发