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");
    }
};

选择建议

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

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

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

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

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

相关推荐
a诠释淡然2 分钟前
C++ vs Rust:哪个更适合你的下一个项目?
开发语言·c++·rust
meilindehuzi_a5 分钟前
深入理解 JavaScript 执行机制:从编译阶段到调用栈底层实现
开发语言·javascript·ecmascript
小小de风呀6 分钟前
de风——【从零开始学C++】(十二):stack和queue的基本使用和模拟实现
开发语言·c++
huohaiyu17 分钟前
深入解析Java垃圾回收机制
java·开发语言·算法·gc
汉克老师18 分钟前
GESP6级C++考试语法知识(五十三、动态规划----背包问题(六、分组背包)
c++·动态规划·背包问题·gesp6级·gesp六级·分组背
YsyaaabB30 分钟前
LangChain作业二---多语言翻译Prompt
开发语言·python·langchain
SunnyDays101132 分钟前
如何在 Java 中实现 OFD 与 PDF 格式互转
java·开发语言
keykey6.42 分钟前
用 PyTorch 训练图像分类器:完整实战
开发语言·人工智能·深度学习·机器学习
雪度娃娃43 分钟前
转向现代C++——保证const成员函数的线程安全性
开发语言·c++
坚果派·白晓明1 小时前
[鸿蒙PC三方库移植适配] 使用 AtomCode + Skills 自动完成Protobuf鸿蒙化适配
c语言·c++·华为·harmonyos