J'ai une classe - PluginLoader
qui traite avec une autre classe Plugin
pour mener à bien ses fonctions. La classe Plugin
utilise certaines fonctions dans PluginLoader
. Ces deux classes sont des classes de base abstraites donc je ne peux pas déclarer Plugin
comme ami de PluginLoader
. Et je ne veux pas que les fonctions Plugin
soient disponibles dans l'interface publique de PluginLoader
car elles n'ont aucune pertinence pour l'utilisateur de PluginLoader
. Est-ce un problème courant? Comment le résoudre?Comment exposer un sous-ensemble de l'interface publique à une classe
EDIT: Exemple de code
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)
{
//Do stuff
oPLoader.RegisterPlugin(this);
}
}
Bien que je veux RegisterPlugin
soit disponible pour la classe Plugin
, il n'y a pas de point laisser visible aux autres utilisateurs de PluginLoader
classe.
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();
}
Cela jette l'erreur du compilateur:
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
Ce qui nous amène plein cercle. Ou y a-t-il quelque chose qui me manque?
Pretty artificiel :). Pouvez-vous s'il vous plaît fournir un exemple de code? – nakiya
Quelqu'un peut-il m'expliquer cela en détail? :(J'ai essayé de faire ce à quoi il ressemble, il me demande de faire sans résultat – nakiya
Ce n'est pas du tout artificiel Logiquement, vous avez deux interfaces séparées à votre plugin loader, l'interface qu'il expose aux plugins pour se permettre pour l'enregistrer et l'interface qu'il expose au monde, alors implémentez-le en tant que tel –