在C ++中管理成员函数执行

时间:2011-02-23 09:42:16

标签: c++ oop function

我有一个类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 ++做到这一点?

5 个答案:

答案 0 :(得分:4)

你的问题遗漏了几个关键的细节(比如some arguments应该做的事情)。但是,听起来您可能需要Managed来包含std:list个函数指针。然后f函数可以简单地遍历列表,并依次调用每个元素指定的函数。

我无法评论您如何填充列表;这取决于您班级的API。

答案 1 :(得分:4)

使用Strategy design pattern

在这种特殊情况下,您不需要使用接口进行完整的策略模式实现。一个函数指针可以:

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;
    }
};