#include <iostream>
class A {
private:
int privateVar;
public:
A(int value) : privateVar(value) {}
friend class B;
};
class B {
public:
void accessPrivate(A& a) {
std::cout << "Accessed private variable of A: " << a.privateVar << std::endl;
}
};
合理应用场景
- 辅助类场景:当一个类是另一个类的辅助类,辅助类需要频繁访问主类的私有成员来完成特定功能时。例如,一个
Matrix
类表示矩阵,有私有成员存储矩阵数据,而MatrixHelper
类用于对Matrix
进行一些特殊运算,如求逆、转置等,MatrixHelper
作为Matrix
的友元类,可直接访问Matrix
的私有数据成员,这样设计能让辅助类专注于特定功能,同时主类保持数据封装。
- 框架与插件场景:在框架开发中,框架类可能有一些私有状态和数据结构,插件类需要访问这些私有内容来扩展框架功能。将插件类设为框架类的友元,能使插件类方便地获取和修改框架类的私有成员,实现定制化的功能扩展。
可能带来的问题
- 破坏封装性:友元类打破了类的封装原则,使得类的私有成员可以被其他类直接访问。这可能导致代码的可维护性降低,因为对私有成员的修改可能会影响到友元类,增加了代码修改的风险和复杂度。
- 增加耦合度:友元关系使得两个类之间的联系更加紧密,一个类的实现细节暴露给了友元类。这意味着如果其中一个类发生变化,尤其是私有成员的变化,很可能需要同时修改友元类,增加了类之间的耦合度,不利于软件的模块化和可扩展性。