我有一個類 - 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
這給我們帶來了一圈。還是有什麼我失蹤?
漂亮做作:)。你能提供一個代碼示例嗎? – nakiya 2010-11-03 09:14:26
任何人都可以向我詳細解釋這一點嗎? :(我試圖做它看起來像在要求我做什麼沒有結果 – nakiya 2010-11-03 09:41:16
它根本沒有作出任何設計從邏輯上說,你有兩個單獨的接口到你的插件加載器,它暴露在插件允許自己的接口註冊以及它暴露給世界的界面,所以這樣實現它。 – 2010-11-03 09:55:26