我正在进行一个个人项目,我需要一个动态工厂。 目前我有以下“系统”:
class Action { ...} // Which is abstract
class A : public Action { ... }
class B : public Action { ... }
class C : public Action { ... }
...
std::map<std::string, Action *> _actions;
_action.insert( { "A", new A() } );
_action.insert( { "B", new B() } );
_action.insert( { "C", new C() } );
Action * act = _actions.find("B")->second; // Get action's pointer
但我对这种解决方案并不满意,因为即使我从未使用这些操作,它们也会在启动时被实例化并在整个应用程序的生命周期中保留在内存中,如果我想要一个“干净”的对象,我需要动态地将对象强制转换以确定其类型,并调用复制构造函数... 我真的不喜欢这个解决方案,因为我必须“硬编码”所有情况...
我不知道我所想象的解决方案是否真的可行,但这是我的想法:
我保留以前的类层次结构,它是:
class Action { ...} // Which is abstract
class A : public Action { ... }
class B : public Action { ... }
class C : public Action { ... }
但是我想以不同的方式使用地图:
std::map<std::string, POINTER_ON_CLASS_CONSTRUCTOR> _actions;
_actions.insert( { "A", &A::A } );
_actions.insert( { "B", &B::B } );
_actions.insert( { "C", &C::C } );
Action * act = new (_actions.find("B")->second);
总之,我的想法是:
我想在每个我想映射的构造函数中将一个关键字与指针相对应,然后根据关键字动态实例化一个基于操作的对象。
非常感谢您的帮助,如果您有解决此问题的建议,请不要犹豫提交 :)
背景:
我正在为我的软件创建一个CLI,如果我想编写此解决方案,则是将操作的第一个单词与相关操作进行映射。
例如:如果我输入“add file.txt”,“add”将是我的映射的键,以检索类“AddAction”的“clean”实例(它是操作的子类 - 它是所有基于操作的类共同的抽象类)。
编辑:在发布此问题之前,我已经在网上和这个论坛上搜索过了,但是我没有找到我需要的东西。 :/
new
并存储指向它们的指针。 - Chris Dodd