I have a design pattern that very well suites your requirement and I have used it several times.
Please read the code.
Brief view: There is a GlobalData class which inherits from GlobalDataInfoIface and GlobalDataPopulateIface.
User cannot access the GlobalData directly. It can access the global data via two interfaces only, depending upon its usage.
class GlobalDataPopulateIface {
public:
virtual void buildMap() = 0;
virtual ~GlobalDataPopulateIface() {}
};
class GlobalDataInfoIface {
public:
virtual map<int,int>& getMap() = 0;
virtual ~GlobalDataInfoIface() {}
};
class GlobalData : public GlobalDataInfoIface, public GlobalDataPopulateIface
{
public:
void buildMap();
map<int,int>& getMap();
private:
// All constructors and destructors are made private
GlobalData ();
~GlobalData ();
GlobalData ( const GlobalData& other );
const GlobalData& operator = ( const GlobalData &other );
map<int,int> aMap;
};
class GlobalDataImplInfo {
public:
CGSimWaveformImplInfo();
~CGSimWaveformImplInfo();
GlobalDataInfoIface* GetGlobalDataInfoIface();
GlobalDataPopulateIface* GetGlobalDataPopulateIface();
static void Destroy();
private:
static GlobalData* global_data;
GlobalDataImplInfo(GlobalDataImplInfo const&);
GlobalDataImplInfo& operator= (GlobalDataImplInfo const&);
};
Client who want to populate the data, should have following code:
GlobalDataImplInfo global_data;
GlobalDataPopulateIface * global_data_populate = global_data.GetGlobalDataPopulateIface();
Client who want to use the global data, should have following code:
GlobalDataImplInfo global_data;
GlobalDataInfoIface * global_data_info = global_data.GetGlobalDataInfoIface();
In this architecture we have defined the boundaries of the implementer and user of global data in the architecture itself. Thus, helps in inducing the correct use of Global data.
User of global data cannot modify the global data.
Please let me know if you did not understand the code. We can discuss that.