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");
}
};
选择建议
-
对于简单关系,使用组合或参数传递
-
需要访问私有成员时考虑友元(但应谨慎使用)
-
对于复杂通信或解耦需求,考虑观察者或中介者模式
-
避免过度使用友元,因为它会破坏封装性
每种方法都有其适用场景,应根据具体需求选择最合适的通信方式。