【发布时间】:2019-08-01 13:14:07
【问题描述】:
我有一个虚拟/父类 和这个班的许多孩子。 我假设这些孩子是用一种 API 生成问题答案的不同方式——例如各种通信协议。 它们可以有不同的版本。
class A {
public: virtual const char * [] GetProtocolName () {return "A"; }
};
class B: public A {
public: virtual const char * [] GetProtocolName () {return "B"; }
};
class C: public B {
public: virtual const char * [] GetProtocolName () {return "C"; }
};
....
假设在程序中我想列出我的子类/子列表 - 每个类都有一个功能: * char [] GetProtocolName()
并根据协议: 协议 1
协议 2
协议 x...
用户可以选择应该通过哪个类来处理通信
我的问题如下:
如何在程序中 - 即编译后,以及如何将其保存在代码中,编译前 - 我可以确定所选类将是我的虚拟类/父级的子 X - 基于文本设置(SELECT此列表类中的 USER)。
问题在于两件事: 如何将每个可用类列为 A 类的子类,在程序中可用
如何分配孩子 - 从众多协议中选择一个 - 根据您从列表中选择的内容(即基于 * char []) ?
class * communicationProtocol = ?????
我是这个主题的新手。谢谢你的任何提示。我不知道该使用什么短语,而我想要的短语给了我我已经拥有的知识。
【问题讨论】:
-
要列出每个可用的类,它是 A 类的子类,您需要自己创建此列表。要获得类型(类)列表,请查看
std::tuple。但我所有的想法都以一个大的 switch 语句结束,将预编译与后编译联系起来。 -
是的,但是拥有这么大的 switch 语句(在阅读问题时我首先想到的也是)似乎不是一个伟大的架构..
-
让你的所有代码都充满了大的 switch 语句并不是很好,尽管在某种程度上你需要一个 switch,这不是问题。也许看看工厂模式
-
这并没有解决问题,但是返回类型为
const char*[]的函数返回字符串文字似乎很奇怪。这样做可能有充分的理由,但该函数似乎更有可能应该是virtual const char* GetProtocolName() { return "A"; }。并且该函数应标记为const:virtual const char *GetProtocolName() const { return "A"; }。 -
c++ 不支持在运行时确定可用的类名,但是您可以通过在启动时通过静态调用让每个作为子候选的类注册自己来帮助编译器应用程序,除了@generic_opto_guy 提出的手动列表