2017-03-03 136 views
0

与其他用户一样,我试图实现不可能或非常复杂的事情。我读了很多问题,比如“遍历所有派生类”,但正如我所见,这是不可能的。但我想问的是可以自动注册派生类。也许使用一些模板。或者,例如使用带有特殊名称的模板函数(例如template<typename T> void register(SomeFabric* f, T* t = new T()))并遍历所有'注册'类型(如果可能的话)。或者使用另一个特殊函数(例如void register(SomeFabric* f, Base* base))并遍历所有可用类,如果可以使用此参数调用此特殊函数,并且可以实例化可迭代类 - 请调用它。 如果完全不可能:注册类最简单(开发者操作的最低数量)方式是什么?使用C++自动注册派生类11

+1

您似乎想要自我注册抽象工厂。像这里描述的那样:http://www.dorodnic.com/blog/2014/03/29/abstract-factory/ – Baldrick

+0

@Baldrick叶,这是我想要的。 Thankyou为链接。这非常有用。如果没有人会提供更有用的东西,我想我会请你写回答。 – Megaxela

+0

您正在讨论解决某些问题的方法。该解决方案与“迭代所有派生类”或“注册派生类”有关。首先,这意味着什么*不清楚*(你的意思是实例吗?类?你想要在注册表中重复使用哪些类?),并且计算出你想要的功能是不可能的,因为你不需要提到这个“解决方案”试图解决的根本问题。请澄清潜在的问题。通过迭代派生类来明确你的意思,并给出具体的程序行为例子。 – Yakk

回答

0

最简单的解决办法是保持在基类的静态字段派生类的列表:

static vector<*BaseClass> children; 

然后寄存器新的BaseClass的构造函数实例:

children.push_back(this) 

而且删除来自基类析构函数中的注册表。

不要从派生类忘记调用父类的构造

Derived(int a, int b) : BaseClass() {...} 

注意,虽然这种解决方案将工作,它是差但从架构的角度。它介绍了全球的状态以及与之相关的所有问题。

+0

什么是* MyClass? – Yakk

+0

将其重命名为BaseClass。 –

+0

什么是'* BaseClass'?这些令牌没有意义。更改标识符不会改进它。 – Yakk