gpt4 book ai didi

c++ - 如何将公共(public)接口(interface)的子集暴露给类

转载 作者:太空狗 更新时间:2023-10-29 21:08:01 25 4
gpt4 key购买 nike

我有一个类 - PluginLoader,它处理另一个类 Plugin 以执行其功能。 Plugin 类使用了PluginLoader 中的一些函数。这两个类都是抽象基类,所以我不能将 Plugin 声明为 PluginLoader 的友元。而且我不希望 Plugin 使用的函数在 PluginLoader 的公共(public)接口(interface)中可用,因为它们与 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 类的其他用户可见。

编辑 2:@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

这给我们带来了完整的循环。还是我遗漏了什么?

最佳答案

OP 有代码片段之前的响应

我没有看到您指出的 friend 的问题。两个抽象类可以成为彼此的 friend 。绝对没有问题。

这就是我猜你的意思......(只是一个示例说明代码)

struct pluginloader;

struct plugin{
public:
void publicm(pluginloader &r);
virtual ~plugin() = 0; // abstract
private:
void privatem(pluginloader &r); // may be virtual in real code
};

struct pluginloader{
public:
void publicm(){};
virtual ~pluginloader() = 0; // abstract
private:
void privatem(){} // may be virtual in real code
friend struct plugin; // friend declaration
};

void plugin::publicm(pluginloader &r){
r.privatem(); // use private methods of pluginloader
}

void plugin::privatem(pluginloader &r){
r.privatem(); // use private methods of pluginloader
}

plugin::~plugin(){}
pluginloader::~pluginloader(){}

struct APlugin : plugin{
~APlugin(){}
};

struct ALoader : pluginloader{
~ALoader(){}
};

int main(){
APlugin apl;
ALoader ald;

apl.publicm(ald);
}

关于c++ - 如何将公共(public)接口(interface)的子集暴露给类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4084772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com