类构造器上的指针
我正在做一个个人项目,我需要一个动态工厂。目前我有以下“系统”:
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”类(它是 Action 的子类 - 它是抽象的并且对所有人来说都是通用的)上的“干净”实例基于动作的类)。
编辑:在发布这个问题之前,我在网上和这个论坛上搜索过,但我还没有找到我想要的东西..:/
回答
您可以将名称映射到工厂函数,然后在每次要创建新实例时调用这些函数。将它包裹在 a 中unique_ptr会给您带来使用后想要的破坏。实时链接
std::unordered_map<std::string, std::function<std::unique_ptr<Action>()>> ACTIONS = {
{"A", [] { return std::make_unique<A>(); }},
{"B", [] { return std::make_unique<B>(); }},
{"C", [] { return std::make_unique<C>(); }}
};
int main() {
auto action = ACTIONS["A"]();
}