I have a class - PluginLoader , which deals with another Plugin class to perform its functions. Plugin class uses some functions in the PluginLoader . Both of these classes are abstract base classes, so I cannot declare Plugin as a friend of PluginLoader . And I donβt want the Plugin functions to be available in the public PluginLoader interface, because they are not related to the PluginLoader user. Is this a common problem? How to solve it?
EDIT: Code Example
class PluginLoader { public: virtual void RegisterPlugin(Plugin*) = 0; virtual void RegisterFunction(int, Plugin*) = 0; }; class Plugin { public: virtual void Load(PluginLoader&) = 0; } class PlugImp : public Plugin { public: virtual void Load(PluginLoader& oPLoader) {
Although I want RegisterPlugin be available for the Plugin class, it makes no sense to leave it visible to other users of the PluginLoader class.
EDIT2: @chubsdad
#include <iostream> using namespace std; class PluginLoader; class Plugin { public: virtual void Register(PluginLoader&) = 0; virtual ~Plugin() = 0; }; class PluginLoader { public: virtual void Load() = 0; virtual ~PluginLoader() = 0; private: friend class Plugin; virtual void RegisterPlugin(Plugin&) = 0; }; class PluginImp : public Plugin { public: void Register(PluginLoader& oPLoader) { oPLoader.RegisterPlugin(*this); } }; class PluginLoaderImp : public PluginLoader { public: void Load() { Plugin* pP = new PluginImp(); pP->Register(*this); } private: void RegisterPlugin(Plugin& oP) { cout << "PluginLoaderImp::RegisterPlugin" << endl; } }; int main() { PluginLoader* pPLoader = new PluginLoaderImp(); pPLoader->Load(); }
This causes a compiler error:
main.cpp: In member function Γ’β¬Λvirtual void PluginImp::Register(PluginLoader&)Γ’β¬β’: main.cpp:22: error: Γ’β¬Λvirtual void PluginLoader::RegisterPlugin(Plugin&)Γ’β¬β’ is private main.cpp:30: error: within this context
Which brings us a full circle. Or am I missing something?
c ++ design oop
nakiya
source share