【发布时间】:2010-11-03 06:49:17
【问题描述】:
我有一个类 - PluginLoader 处理另一个类 Plugin 来执行其功能。 Plugin 类使用了PluginLoader 中的一些函数。这两个类都是抽象基类,所以我不能将Plugin 声明为PluginLoader 的朋友。而且我不希望Plugin 使用的函数在PluginLoader 的公共界面中可用,因为它们与PluginLoader 的用户无关。这是个常见的问题吗?如何解决?
编辑:代码示例
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);
}
}
虽然我希望RegisterPlugin 可用于Plugin 类,但让PluginLoader 类的其他用户可见是没有意义的。
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();
}
这会引发编译器错误:
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
这给我们带来了完整的循环。还是我缺少什么?
【问题讨论】: