Допустим, у меня есть класс MainApp, использующий методы динамической библиотеки через интерфейс FrontEnd
FrontEnd внутренне использует экземпляры класса Data (содержатся в классе BackEnd)
Этот класс Dataсодержит только элемент и его метод доступа, нет открытого метода для управления элементом
Хорошо, теперь MainApp не знает данных и не может получить к ним доступ, но ему необходимо косвенно манипулировать им
Моя цельдолжен создать какую-то ссылку, сохраняющую указатель на данные с двумя поведениями
- , запрещающий доступ к данным в MainApp
- разрешение доступа к данным в FrontEnd
Я перечислил некоторые решения, такие как PIMPL idiom, Bridge или Pattern Adapter, но проблема в том, что я не хочу использовать Reference как интерфейс, а просто как держатель
Как я могу справиться с этим?
Вот пример кода для иллюстрации:
Data.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;
};
Reference.hpp
#include //???
struct Reference {
Reference(Data* d):mData(d){}
private:
//no access to data->member
Data* mData;
};
переднийEnd.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
};