【发布时间】:2011-11-30 18:03:10
【问题描述】:
假设我有一个 MainApp 类,它通过接口 FrontEnd 使用动态库的方法
FrontEnd 使用 Data 类的内部实例(包含在 BackEnd 类中)
该类Data只包含一个成员及其访问器,没有公共方法来操作该成员
好的,现在 MainApp 不知道 Data 并且无法访问它,但它需要间接地操作它
我的目标是创建某种引用来保持指向具有 2 种行为的 Data 的指针
- 在 MainApp 中禁止访问数据
- 在前端允许访问数据
我列出了一些解决方案,例如 PIMPL idiom、Bridge 或 Adapter 模式,但问题是我不想将 Reference 用作接口,而是将其用作支架
我该如何处理?
这里有一些代码来说明:
数据.hpp
struct Data {
Data(int i):member(i){}
int getMember();
private :
int member;
};
BackEnd.hpp
#include "Data.hpp"
struct BackEnd {
BackEnd(){}
Data* createData(int i) {
Data* d = new Data(i);
mDatas.push_back(d);
return d;
}
void doSomething(Data* d, int param) {
int r = param+d->getMember();
/*do other things with d*/
}
private:
vector<Data*> mDatas;
};
参考.hpp
#include //???
struct Reference {
Reference(Data* d):mData(d){}
private:
//no access to data->member
Data* mData;
};
前端.hpp
#include "Data.hpp"
#include "Reference.hpp"
#include "BackEnd.hpp"
struct FrontEnd {
Reference* createData(int i) {
Data* d = mBackEnd->createData(i);
//conversion Data to Reference
Reference ref = new Reference(d);
return ref;
}
void doSomething(Reference* ref) {
//In the Front-End, I want an access to Ref->mData
Data* d = ref->getData();//Allows access to Ref->mData
int result = mBackEnd->doSomething(d);
}
private:
BackEnd* mBackEnd;
};
MainApp.hpp
//I don't want to reference Data.hpp
#include "Reference.hpp"
#include "FrontEnd.hpp"
struct MainApp {
Reference* createRef(){ mRef = mFrontEnd->createData(8);}
void doSomething(){ mFrontEnd->doSomething(mRef); }
private:
FrontEnd* mFrontEnd;
Reference* mRef;
//I want to keep a reference to Data without using Data directly
//Forbids access to mRef->mData
};
【问题讨论】:
-
class Reference文件需要包含Data.hpp,除非你正在做整个pImpl的事情。
标签: c++ design-patterns reference friend access-control