所以我正在学习C ++,而我正试图找出一种基于运行时接收的输入构建一系列函数的方法。基本的想法是我计划有一个函数来创建一个能力,它可以由几个动作构成,它可以有几个形状,可以有几种效果。我计划出来的代码(没有正确拆分函数或实际编写代码)的结构如下:
//Planned function:
/*
Ability()
{
Action 1()
{
Type of action
Shape 1 of Action 1()
{
Type of shape
Effect 1 of Shape 1 of Action 1()
{
Type of effect
}
Any more effects?
}
Any more shapes?
}
Any more actions?
}
/**/
但我不太确定如何根据用户输入积极构建这样的嵌套函数集,存储它,并将其用作稍后在运行时运行而不必重建它的东西。
我很抱歉,如果我只是遗漏了一些明显的东西,我还没有真正得到过去的对象类。
答案 0 :(得分:0)
我会根据用户输入积极构建这样的嵌套函数集,存储它,并将其用作稍后在运行时运行而不必重建它的东西。
基本上,你需要的是保存一组稍后要调用的操作。在软件工程中,这称为Command pattern。简而言之,每个操作(命令,动作,函数......)被建模为一个对象,其中包含执行操作所需的所有信息以及触发(执行,执行,运行...)它的方法。通常,这些对象符合相同的界面,因此您可以多态地触发它们。
在C ++中,一个简单的命令可能如下所示:
class Command
{
int state_;
public:
explicit Command(int state) : state_(state) {}
void operator()() {
// do something with your state
}
};
然后您可以存储命令列表:
std::vector<Command> commands;
commands.push_back(Command(1));
commands.push_back(Command(2));
// ...
后来运行它们:
for (auto & c : commands)
c();
通常,您需要使用不同类型的命令,因此Command
将是一个抽象类,然后您将派生出几个代表不同操作的不同类。
然后,为了像你说的那样“嵌套”函数(即为了编写命令),你可以简单地将Command
存储在其他Command
中。
当然,这是针对该问题的OOP方法 - 您可以始终将其展平并编写一个等效算法,该算法读取包含所有必需参数的某些数据结构,并根据它们在每个步骤执行相应的操作;而不是将它传播到不同的班级。
最后,还有一个注意事项:在C ++中有很多东西可以调用/调用(Callable
):函数,函数对象(如上所示),指向成员函数的指针,lambda表达式...如果你想要进入OOP路线并且完全通用,你可以轻松利用std::function
(或类似的实现,如boost::function
用于预C ++ 11),是一个通用的多态包装器,可以存储其中任何一个。