我有一个类Managed
,它包含一个函数f
,它执行该类的其他函数。
class Managed {
public:
Managed(){}
~Managed(){}
int f( some arguments ); //managed function
private:
int A();
int B();
int C();
};
我想管理f
执行的操作,具体取决于类Managed
的对象的构造方式,即使其行为如此
int Managed::f (some arguments) {
A();
B();
A();
return 0;
}
或者像这样
int Managed::f (some arguments) {
C();
B();
return A();
}
等
我需要管理非常灵活,我需要像编写函数f
的行为脚本。我怎么能用C ++做到这一点?
答案 0 :(得分:4)
你的问题遗漏了几个关键的细节(比如some arguments
应该做的事情)。但是,听起来您可能需要Managed
来包含std:list
个函数指针。然后f
函数可以简单地遍历列表,并依次调用每个元素指定的函数。
我无法评论您如何填充列表;这取决于您班级的API。
答案 1 :(得分:4)
在这种特殊情况下,您不需要使用接口进行完整的策略模式实现。一个函数指针可以:
class Managed {
public:
Managed(int type)
{
switch(type) {
case 1: strategy_ = strategy1; break;
case 2: strategy_ = strategy2; break;
default: abort();
}
}
int f(int arg) { return strategy_(this, arg); }
private:
static int startegy1(Managed* that, int arg)
{
that->A();
that->B();
that->C();
return arg;
}
static int startegy2(Managed* that, int arg)
{
that->A();
that->C();
return arg;
}
// ... more strategies ...
int A();
int B();
int C();
int(*strategy_)(Managed*, int arg);
};
答案 2 :(得分:3)
听起来你可以使用Command设计模式。你的f函数应该采用“命令”的集合(向量或列表)(可以是简单的枚举整数,如Call_A,Call_B,Call_C,Call_A_SaveReturnValue,Call_B_SaveReturnValue,Call_C_SaveReturnValue,ReturnSavedValue,Return0,ReturnInt等,或者更复杂的对象来表示更复杂的功能,然后你的函数f按顺序“执行”这些命令,并为每个“命令”执行功能。
编辑:如果你想要f()的参数用于其他目的(在你的问题中不清楚),那么只需将命令行设置为类的状态并使用f()的参数无论你想要什么。
答案 3 :(得分:0)
你想要的东西在c ++中很难做到,因为它是一种强类型语言,这使得它像某些脚本语言一样完全灵活。例如,如果你需要传递一个在编译中没有修复的类型的变量,你会发现很难做到你想要的。
如果您不需要完全的完全灵活性,并且方法的签名是固定的,那么最简单的方法是使用指向成员方法的指针以及switch或查找表。
答案 4 :(得分:0)
也许,您应该尝试使用继承来解决问题:
class Managed { public: Managed(){} ~Managed(){} virtual int f(int a,int b,int c); protected: int A() {return 1;} int B() {return 2;} int C() {return 3;} }; class Managed1: public Managed { Managed1(){} ~Managed1(){} virtual int f(int a,int b,int c) { A(); B(); A(); return 4; } };