面试题答案
一键面试方案设计
- 友元类或友元函数:
- 可以将
ModuleA
、ModuleB
、ModuleC
对应的类声明为CoreClass
的友元,这样这些类就可以访问CoreClass
的非公有成员criticalData
。 - 或者在
CoreClass
中声明特定的友元函数,这些函数在ModuleA
、ModuleB
、ModuleC
的相关源文件中定义,通过友元函数来访问criticalData
。
- 可以将
优缺点
- 优点:
- 实现简单,直接利用C++的友元机制,能够快速满足特定模块访问非公有成员的需求。
- 对原
CoreClass
的接口影响较小,不需要在CoreClass
中额外暴露过多的公有接口。
- 缺点:
- 破坏了类的封装性,友元可以访问类的非公有成员,一定程度上违背了面向对象编程中数据隐藏的原则。
- 友元关系是单向且非传递的,管理起来可能会比较复杂,如果项目结构发生变化,需要修改友元声明,维护成本可能较高。
适用场景
适用于在一个相对封闭的项目模块结构中,几个特定模块需要紧密协作,对CoreClass
的criticalData
有频繁访问需求,且对封装性要求不是绝对严格的场景。
代码示例
// CoreClass.h
class CoreClass {
private:
int criticalData;
// 声明ModuleA对应的类为友元
friend class ModuleA;
// 声明ModuleB对应的友元函数
friend void accessCriticalDataFromModuleB(CoreClass* core);
public:
CoreClass(int data) : criticalData(data) {}
};
// ModuleA.h
class ModuleA {
public:
void accessCriticalData(CoreClass* core) {
// 访问CoreClass的非公有成员criticalData
std::cout << "ModuleA access criticalData: " << core->criticalData << std::endl;
}
};
// ModuleB.cpp
#include "CoreClass.h"
#include <iostream>
void accessCriticalDataFromModuleB(CoreClass* core) {
std::cout << "ModuleB access criticalData: " << core->criticalData << std::endl;
}
// main.cpp
#include "CoreClass.h"
#include "ModuleA.h"
#include <iostream>
int main() {
CoreClass core(10);
ModuleA moduleA;
moduleA.accessCriticalData(&core);
accessCriticalDataFromModuleB(&core);
return 0;
}