【发布时间】:2015-03-06 00:07:55
【问题描述】:
我编写了一个基于管道和过滤器的架构。为避免混淆,过滤器在我的代码中称为“阶段”。这是基本的想法:
我希望其他开发人员能够实现他们自己的 Stage 类,然后我可以将其添加到运行时已经存在的 Stage 列表中。
我已经阅读了一段时间,似乎它们是动态代码加载的限制。我当前的 Stage 课程如下所示:
class Stage
{
public:
void Process();
const uint16_t InputCount();
const uint16_t OutputCount();
void SetOutputPipe(size_t idx, Pipe<AmplitudeVal> *outputPipe);
void SetInputPipe(size_t idx, Pipe<AmplitudeVal> *inputPipe);
protected:
Stage(const uint16_t inputCount, const uint16_t outputCount);
virtual void init() {};
virtual bool work() = 0;
virtual void finish() {};
protected:
const uint16_t mInputCount;
const uint16_t mOutputCount;
std::vector< Pipe<AmplitudeVal>* > mInputs;
std::vector< Pipe<AmplitudeVal>* > mOutputs;
};
AmplitudeVal 只是 float 的别名。此类仅包含对其连接的管道(mInputs 和 mOutputs)的引用,它不处理任何算法活动。为了便于外部开发人员使用,我想尽可能少地公开。现在这个类只依赖于管道头和一些基本的配置文件。大多数处理加载 DLL 的示例都提出了一个只有纯虚函数且几乎没有任何成员变量的类。我不确定我应该怎么做。
【问题讨论】:
-
如果我理解得很好,您的目标是将 Stage 作为 DLL 提供,用户可以导入它并进一步派生它。这是你的意思吗?
-
不完全清楚你的问题是什么。但我要指出在“数据管道”中越来越流行使用something like ZeroMQ。与“插件”相比,这使您可以以一种方式定义事物,即它们可以是进程内、进程外,甚至可以让这些片段以不同的语言在不同的网络位置运行。如果您发现您正在设计一个管道接口并期望不同的作者将事物连接在一起,那么可能值得一看。 (但我不知道你的目的。)
-
@Christophe 是的,确实。
标签: c++ inheritance dll